const arr=[
{name:'harry', age:14},
{name:'sam', age:40},
{name:'gloria', age:16},
{name:'riky', age:33},
]
/*
// 1. reduce(function(a,b),initValue)
使用reduce()函数每一次都会将上一次回调函数的返回值作为a的值,刚开始的时候a的初始值为initValue
如果reduce没有设置初始值initValue的话,a的值就为调用reduce函数的数组的第一个元素
运行时,第二次及后续执行时,会将前一次执行的结果赋给a
在有初始值的情况下,b的值是数组的第一个元素,如果a的值是数组的第一个元素的话,b的值就是数组的第二个元素
在运算的过程中b的值为上一个值的下一个值
// 2. {...obj, [currentValue[key]]: currentValue}
上面是使用拓展运算符构建字面量对象的写法,
举一个栗子,假设obj={11: {name: 'lili', age: 11}, 12: {name: 'ammy', age: 12}}
...obj就是将obj对象所有可枚举的属性展开,变为11: {name: 'lili', age: 11}, 12: {name: 'ammy', age: 12}
{...obj, [currentValue[key]]: currentValue}就会得到 --> {11: {name: 'lili', age: 11}, 12: {name: 'ammy', age: 12}, [currentValue[key]]: currentValue}
这样看其实就是把obj对象和新获得的属性`[currentValue[key]]: currentValue`合并起来,变成一个新的对象
跟前面的reduce()函数的使用结合起来,就是,刚开始的时候obj是一个空对象(等于reduce参数initValue),经过reduce的回调函数运算后,他得到了一个新的对象obj2
这个obj2就变成了下一次运算的起始值,注意这样使用`a = {...obj}`展开运算符的赋值跟直接`a = obj`是不一样的,
前者赋值后a和obj是两个不一样的对象,后者只是把obj指针指向的堆内存地址拷贝了一份给a,他俩指向同一个堆内存地址,改变a的属性值,b的也会变
*/
function convertArrtoObj(arr, key){
return arr.reduce((obj, currentValue) => {
return {
...obj,
[currentValue[key]]: currentValue
}
}, initValue)
}
const res = convertArrtoObj(arr, 'age')
console.log();