【问题标题】:How I can merge two arrays objects [closed]我如何合并两个数组对象[关闭]
【发布时间】:2019-06-14 21:41:48
【问题描述】:

我需要使用es6 语法合并两个objects 数组,并且没有重复项。在我的任务中,对象中还有几个键。

但我认为这不是问题。在array2 中总是包含在array1 中的对象

这是数组

array1 = [
   {name: 'one', count: 0}, 
   {name: 'two', count: 0}, 
   {name: 'three', count: 0},
   {name: 'four', count: 0} 
]

array2 = [
   {name: 'two', count: 4},
   {name: 'four', count: 2}
]

我需要这个:

array3 = [
  {name: 'one', count: 0},
  {name: 'two', count: 4},
  {name: 'three', count: 0},
  {name: 'four', count: 2}
]

【问题讨论】:

  • 我们可以引导您或解除阻止,但您必须先尝试。请展示你到目前为止所做的尝试。
  • enter link description here 在此链接上尝试解决方案。
  • 如果在 array1 中你有一个计数为 1 的项目,而在数组 2 中你有一个计数为 2 的相同项目,最终数组中包含的项目的计数值是多少?
  • Merge 2 arrays of objects的可能重复

标签: javascript arrays object ecmascript-6


【解决方案1】:

const array1 = [
  {name: 'one', count: 0}, 
  {name: 'two', count: 0}, 
  {name: 'three', count: 0},
  {name: 'four', count: 0} 
]
const array2 = [
  {name: 'two', count: 4},
  {name: 'four', count: 2}
]

const result = array1.map(a => {
  const b = array2.find(b => b.name === a.name);
  if (b) {
    return {name: a.name, count: a.count + b.count}
  }
  return a;
});

console.log(result);

【讨论】:

    【解决方案2】:
    let all = array1.concat(array2)
    //avoid dupplicates by  key
    let map = all.reduce((acc,item)=>{acc[item.name] = item; return acc;},{});
    //convert map back to array
    let array3 = Object.values(map)
    console.log(array3);
    //
    [ { name: 'one', count: 0 },
      { name: 'two', count: 4 },
      { name: 'three', count: 0 },
      { name: 'four', count: 2 } ]
    

    【讨论】:

      【解决方案3】:

      map 可用于对数组的每个元素调用函数。与使用find 的版本的主要区别在于它将遍历array2 的所有元素,因此如果数组中有2 个带有name: 'two' 的元素,它们都会增加计数。对于find,只有找到的拳头才会添加。

      const array1 = [
        {name: 'one', count: 0}, 
        {name: 'two', count: 0}, 
        {name: 'three', count: 0},
        {name: 'four', count: 0} 
        ],
        array2 = [
        {name: 'two', count: 4},
        {name: 'four', count: 2}
        ];
      
      const array3 = array1.map(obj => {
        let _count = obj.count;
        array2.forEach(obj2 => {
          if(obj2.name === obj.name){
            _count += obj2.count;
          }
        });
        return { name: obj.name, count: _count };
      });
          
      console.log(array3);

      编辑:根据@HMR 建议修改(感谢指出我的错误)+ 在 array2 上使用了forEach,因为我不使用任何返回的数组

      【讨论】:

      • map 不应该被用来改变它所使用的数组。最好使用 forEach 或返回一个新对象。
      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-05-31
      • 2013-11-26
      相关资源
      最近更新 更多