如何基于另一个数组的对象更改数组的对象

时间:2019-06-01 10:32:02

标签: javascript reactjs

我遇到了以下问题。我要执行以下操作,有一个5个元素的数组,我想向第二个数组中包含的元素添加一个属性和isExist,否则保持对象不变。

我尝试使用map方法,但是它向我返回了一个数组数组,而我只需要返回前2个对象的附加属性就返回相同的数组。

const arr1 = [{id: 1, title:'test1'}, {id: 2, title:'test2'}, {id: 3, title:'test3'},{id: 4, title:'test4'} ,{id: 5, title:'test5'}];
const arr2 = [{id: 1, title:'test1'}, {id: 2, title:'test2'}];

const filteredArr = arr1.filter(item => {
    return arr2.filter(item2 => {
        if (item2.id === item.id) {
            return {...item, isExist: true}
        } else {
            return {...item}
        }
    })
})

预期结果:在第一个数组中,ID为1和2的对象应另外包含isExist属性,其余应保留在数组中,但不包含isExist属性。

2 个答案:

答案 0 :(得分:0)

您可以使用地图和一些

  • 通过arr1映射,检查id上每个元素的arr2
  • 如果找到,则添加isExist,否则返回原始值

const arr1 = [{id: 1, title:'test1'}, {id: 2, title:'test2'}, {id: 3, title:'test3'},{id: 4, title:'test4'} ,{id: 5, title:'test5'}];
const arr2 = [{id: 1, title:'test1'}, {id: 2, title:'test2'}];


let op = arr1.map(value => {
  let isExist = arr2.some(e => e.id === value.id)
  return isExist ? {...value,isExist} : value
})


console.log(op)

答案 1 :(得分:0)

一种选择是使用Set获取arr2上的所有ID。使用map遍历arr1

const arr1 = [{"id":1,"title":"test1"},{"id":2,"title":"test2"},{"id":3,"title":"test3"},{"id":4,"title":"test4"},{"id":5,"title":"test5"}]
const arr2 = [{"id":1,"title":"test1"},{"id":2,"title":"test2"}]

const ids = new Set(arr2.map(o => o.id));
const filteredArr = arr1.map(item => {
  if (ids.has(item.id)) return { ...item,isExist: true}
  else return item;
})

console.log(filteredArr)

更短版本:

const arr1 = [{"id":1,"title":"test1"},{"id":2,"title":"test2"},{"id":3,"title":"test3"},{"id":4,"title":"test4"},{"id":5,"title":"test5"}];
const arr2 = [{"id":1,"title":"test1"},{"id":2,"title":"test2"}];

const ids = new Set(arr2.map(o => o.id));
const filteredArr = arr1.map(item => ids.has(item.id) ? {...item,isExist: true} : item);

console.log(filteredArr)

相关问题