0
点赞
收藏
分享

微信扫一扫

将数组转为对象:键值对形式

infgrad 2022-01-08 阅读 27
javascript
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();
举报

相关推荐

0 条评论