如何将对象数组转换为以existing_value为键的目标对象?
问题:将对象数组转换为键值对对象
原始对象数组
const values = [{ existing_value: 'Headline 56', new_value: 'Headline_new56', }, { existing_value: 'Headline 59', new_value: 'Headline_new59', }, ]
期望转换结果
const newObject = { "Headline 56": "Headline_new56", "Headline 59": "Headline_new59"}
尝试的错误写法
const newObject = {} const testvalues = values.map(obj => Object.assign( newObject, obj.existing_value: obj.new_value))
错误原因
这段代码有两个问题:一是Object.assign的第二个参数不能直接写obj.existing_value: obj.new_value,必须用对象字面量形式;二是map方法的作用是生成新数组,这里我们的目标是构建单个对象,用map会生成无用的数组,完全没必要。
正确实现方式
方法1:用Array.reduce(最推荐)
reduce可以直接遍历数组并累积出目标对象,代码简洁高效:
const newObject = values.reduce((acc, curr) => { acc[curr.existing_value] = curr.new_value; return acc; }, {});
方法2:用forEach循环赋值
如果觉得reduce不好理解,用forEach遍历数组逐个添加键值对也很直观:
const newObject = {}; values.forEach(obj => { newObject[obj.existing_value] = obj.new_value; });
方法3:修正Object.assign的写法
如果一定要用Object.assign,需要把第二个参数改成带计算属性名的对象,同时用forEach代替map:
const newObject = {}; values.forEach(obj => { Object.assign(newObject, { [obj.existing_value]: obj.new_value }); });
这里的[obj.existing_value]是计算属性名语法,能把变量值作为对象的键名。
内容的提问来源于stack exchange,提问作者Wasswa Samuel
相关产品推荐
相关产品推荐

