如何用JavaScript简化数组结构?将对象数组转为键值对对象
问题分析与解决
你的代码得到[undefined, undefined]的原因有两个:
- 使用
map时,回调函数用大括号{}包裹逻辑但没有显式return值,默认返回undefined,所以最终数组全是undefined - 逻辑方向错误:修改
item.name = item.quantity只是修改原对象的属性,完全没构建出你想要的键值对结构
另外注意:原数组里的orange、apple属于字符串,必须加单/双引号,否则会被当作未定义变量引发报错。
正确解法
方法1:使用reduce(推荐,适合处理大量元素)
// 修正后的原数组(字符串补全引号) const originalArray = [{name: 'orange', quantity: 1}, {name: 'apple', quantity: 3}]; // 用reduce合并成目标对象,再包裹进数组 const result = [originalArray.reduce((acc, current) => { acc[current.name] = current.quantity; return acc; }, {})]; console.log(result); // 输出:[{orange: 1, apple: 3}]
reduce会遍历数组,以空对象{}作为初始累加器,每次把当前元素的name作为键、quantity作为值添加到累加器,最终得到合并后的对象,再放进数组就符合你的期望。
方法2:使用Object.fromEntries(写法更简洁)
const originalArray = [{name: 'orange', quantity: 1}, {name: 'apple', quantity: 3}]; // 先把每个元素转成[name, quantity]的键值对数组,再转成对象 const result = [Object.fromEntries(originalArray.map(item => [item.name, item.quantity]))]; console.log(result); // 输出:[{orange: 1, apple: 3}]
map先把每个对象转换成[键, 值]的格式,Object.fromEntries再把这个二维数组直接转换成目标对象,最后包裹进数组即可。
内容的提问来源于stack exchange,提问作者crawlings
相关产品推荐
相关产品推荐

