如何基于对象辅助函数的键从数组中删除重复的对象?

时间:2019-11-22 08:59:29

标签: javascript arrays

我有一个对象数组和一个对象 例如:arr=[{id:1,name:"foo"},{id:2,name:"bar"}],而我的新对象是obj={id:1,name:"baz"}。我想基于数组内的键替换obj。 预期的是 output=[{id:1,name:"baz"},{id:2,name:"bar"}] 我已经完成了一些工作,如下所示:

function removeObjBasedID(arr, obj) {
  let newArr = [];

  arr.map((item, i) => {
    if (item.id == obj.id) {

      newArr.splice(i, 1);

    } else {
      newArr = [...arr, obj];

    }
  });

  return newArr;
}

console.log(removeObjBasedID(arr, obj));


5 个答案:

答案 0 :(得分:2)

您可以迭代数组并更新(如果找到),或者推送对象。

function update(array, object) {
    for (let i = 0; i < array.length; i++) {
        if (array[i].id !== object.id) continue;
        array[i] = object;
        return;
    }
    array.push(object);
}

var array = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }],
    object = { id: 1, name: "baz" };
    
update(array, object);

console.log(array);

答案 1 :(得分:1)

const arr = [{id:1,name:"foo"},{id:2,name:"bar"}];
const newObject = { id: 1, name: "baz" };
const replacedIndex = arr.findIndex((el) => el.id === newObject.id);
arr[replacedIndex] = newObject;
console.log(arr)

您可以轻松地从数组中找到要替换的对象的索引,并将新对象分配给找到的索引。

答案 2 :(得分:0)

如果要创建新数组,请使用filter

const newArr = arr.filter(item => item.id !== obj.id);

如果要更改现有数组,可以使用findIndex查找条目,然后使用splice

const index = arr.findIndex(item => item.id == obj.id);
if (index !== -1) {
    arr.splice(index, 1);
}

请注意,这假定只有一个条目匹配。如果可能有多个匹配项,我将向后遍历数组:

for (let index = arr.length - 1; index >= 0; --index) {
    const item = arr[index];
    if (item.id == obj.id) {
        arr.splice(index, 1);
    }
}

后退非常重要,因为当您splice时,将以下条目向前移一个。

答案 3 :(得分:0)

这是我的解决方法

const arr = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }];
const obj = { id: 1, name: "baz" };

function removeObjBasedID(arr, obj) {
    for (let idx in arr) {
        if (arr[idx].id === obj.id) {
            arr.splice(idx, 1, obj);
            return arr;
        }
    }
}

console.log(removeObjBasedID(arr, obj));

它保留原始数组的顺序。

答案 4 :(得分:-1)

如果您不在乎位置,请使用es6

let arr = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }]
let obj = { id: 1, name: "baz" }

arr = [obj, ...arr.filter(i => i.id !== obj.id)]