有没有一种方法可以“合并”数组中的两个对象?

时间:2019-11-10 16:05:14

标签: javascript arrays reactjs object

我有两个要合并的数组,像这样:

const arr1 = [{
    id: 1,
    isAvailable: true
  },
  {
    id: 2,
    isAvailable: true
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: false
  }
]

const arr2 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 6,
    isAvailable: false
  }
]

我正在寻找的结果类似于:

const arr3 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: false
  }
]

我需要用第二个数组的值更新第一个数组的值,这样我才能拥有一个新的数组,其中包含真正可用的和不可用的。

4 个答案:

答案 0 :(得分:2)

您可以首先将arr2转换为一个映射对象,该映射对象将ID映射到其可用性,例如{ "1": true, "4": false, ... }。然后将arr1对象映射到新的对象数组中,同时使用map对象更新isAvailable属性:

let map = arr2.reduce((acc, o) => (acc[o.id] = o.isAvailable, acc), {});

let arr3 = arr1.map(o => ({
  id: o.id,
  isAvailable: map.hasOwnProperty(o.id) ? map[o.id] : o.isAvailable
}));

每个新对象将具有与原始对象相同的ID。其isAvailable属性将是来自地图对象的值还是其原始值,这取决于它是否在地图对象中具有条目(无论它在arr2中是否具有对象)

答案 1 :(得分:1)

根据您的示例,这是我的示例程序。希望它能解决您的问题

const arr1 = [{
    id: 1,
    isAvailable: true
  },
  {
    id: 2,
    isAvailable: true
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: true
  }
]

const arr2 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 6,
    isAvailable: false
  }
]
const arr3 = []
for (let i = 0; i < arr1.length; i++) {
  let found = arr2.find(item => item.id === arr1[i].id)
  if (found)
    arr3.push(found)
  else
    arr3.push(arr1[i])
}
console.log(arr3)

输出为
    [ { id: 1, isAvailable: false }, { id: 2, isAvailable: false }, { id: 4, isAvailable: true }, { id: 6, isAvailable: false } ]

答案 2 :(得分:0)

您可以使用Array.map()来执行此操作,方法是覆盖第二个数组中存在的值。

const newArray = arr1.map(({ id, isAvailable}) => {
  const matchingObjects = arr2.filter(({ id: id2 }) => id === id2);
  return matchingObjects.length > 0
    ? { id, isAvailable: matchingObjects[0].isAvailable } // replace the original value
    : { id, isAvailable } // do not overwrite this value
})

答案 3 :(得分:0)

您可以基于arr1过滤arr2,然后将过滤后的arr2arr1合并

const arr1 = [{
  id: 1,  isAvailable: true
},
{
  id: 2,  isAvailable: true
},
{
  id: 4,  isAvailable: true
},
{
  id: 6,  isAvailable: false
}
];

const arr2 = [{
  id: 1,  isAvailable: false
},
{
  id: 2,  isAvailable: false
},
{
  id: 6,  isAvailable: false
}
];

const result = arr1.filter(a => !arr2.some(s => s.id == a.id)).concat(arr2);
console.log(result);

或使用mapsomefind方法:

const arr1 = [{
  id: 1, isAvailable: true
},
{
  id: 2, isAvailable: true
},
{
  id: 4, isAvailable: true
},
{
  id: 6,
  isAvailable: false
}
];

const arr2 = [{
  id: 1, isAvailable: false
},
{
  id: 2, isAvailable: false
},
{
  id: 6, isAvailable: false
}
];
const result = arr1.map(a=> arr2.some(f=> f.id == a.id) ? 
                            arr2.find(f=> f.id == a.id) : a 
                        );
console.log(result);