javascript - 将多维对象数组缩减为单个对象数组

标签 javascript arrays object reduce transpose

我有这个多维对象数组 -

const initialArray = [
  {
   name: 'aaa', 
   value:[{id:1, data:1}, {id:2, data:2}, {id:3, data:3}]
  },
  {
   name: 'bbb', 
   value:[{id:1, data:4}, {id:2, data:5}, {id:3, data:6}]
  },
  {
   name: 'ccc', 
   value:[{id:1, data:7}, {id:2, data:8}, {id:3, data:7}]
  },
  {
   name: 'ddd', 
   value:[{id:1, data:2}, {id:2, data:1}, {id:3, data:1}]
  }
]

我需要将它转换成这个数组 -

const finalArray = [
  {
    id: 1, aaa: 1, bbb: 4, ccc: 7, ddd: 2
  },
  {
    id: 2, aaa: 2, bbb: 5, ccc: 8, ddd: 1
  },
  {
    id: 3, aaa: 3, bbb: 6, ccc: 7, ddd: 1
  }
]

我现在的解决方案是

initialArray.reduce((accum, arrayData) => {
  arrayData.value.forEach(element => {
    if (accum.some(el => el.id === element.id)) {
      accum.find(el => el.id === element.id)[arrayData.name] = element.data;
    } else {
        accum.push({ id: element.id, [arrayData.name]: element.data });
    }
  });
  return accum;
}, []);

有没有更好更优雅的方法来做到这一点?我试图通过减少遍历每个数组的次数并使用更少的代码和更高的可读性来实现这一点。如您所见,每次迭代期间的 some 和 find 都会增加迭代次数。有什么办法可以减少吗?

最佳答案

function tranform(array) {
  const obj = {}
  
  array.forEach(({name, value}) => (value || []).forEach(({id, data}) => obj[id] = { id, ...obj[id], [name]: data } ))
  
  return Object.values(obj)
}

const initialArray = [
  {
   name: 'aaa', 
   value:[{id:1, data:1}, {id:2, data:2}, {id:3, data:3}]
  },
  {
   name: 'bbb', 
   value:[{id:1, data:4}, {id:2, data:5}, {id:3, data:6}]
  },
  {
   name: 'ccc', 
   value:[{id:1, data:7}, {id:2, data:8}, {id:3, data:7}]
  },
  {
   name: 'ddd', 
   value:[{id:1, data:2}, {id:2, data:1}, {id:3, data:1}]
  }
]

console.log(tranform(initialArray))

关于javascript - 将多维对象数组缩减为单个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125693/

相关文章:

javascript - 使用 odata 和 jquery 从 Dynamics Crm 中的实体检索记录

python - 使用 Numpy 随机排列数组的列

java - 将字符串参数添加到数组末尾

javascript - 如何将字符串与对象键进行比较并获取该键的值?

javascript - 填写表单后动态向对象添加新键

javascript - 在选择标签中重定向 ng-change

javascript - jQuery.ajax() - 如何最好地处理超时?

java - 从文件中读取多个对象,就像它们在数组中一样

javascript - CKeditor 应用类在编辑器中隐藏一些图像

php - 循环 preg_match_all 结果