如果对象与数组中的对象之一没有相同的键,则将其添加到数组中

时间:2018-11-22 16:27:12

标签: javascript lodash

我正在使用Lodash。我有下面的数组:

const array = [{id:1,name:a},{id:2,name:b},{id:3,name:c},{id:4,name:d},{id:5,name:e}];

,我要向该数组添加另一个对象,但是在此之前,我需要检查新对象的名称是否已经在数组中,以及是否有一个名称不添加新对象的对象。反对了。 我知道一些方法,例如,使用_.map循环,但想确保是否有更简单的方法。

4 个答案:

答案 0 :(得分:2)

您可以使用Lodash的some,如果提供了适当的谓词,例如(item => item.name === newName)将返回一个布尔值,指示该项目是否已经存在(在这种情况下,为true表示名称已经存在)。与其他迭代方法相比,使用此方法的好处是,一旦找到返回true的迭代方法,它将立即停止,从而提高性能。

答案 1 :(得分:0)

使用本机javascript,您可以使用findIndex,这将返回名称匹配的对象的索引。如果它返回-1,则没有这样的同名对象。在这种情况下,请更新数组。

const array = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}, {
  id: 4,
  name: 'd'
}, {
  id: 5,
  name: 'e'
}];

let newObjToAdd = {
  id: 1,
  name: 'z'
};
let newObjNotToAdd = {
  id: 1,
  name: 'a'
}


function updateArray(obj) {
  let k = array.findIndex((item) => {
    return item.name === obj.name;
  })
  if (k === -1) {
    array.push(obj)
  } else {
    console.log('Array contains object with this name')
  }
}

updateArray(newObjToAdd);
console.log(array)
updateArray(newObjNotToAdd);

答案 2 :(得分:0)

some不需要lodash。您也可以使用本机JS(ES6)来做到这一点:

const array = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'},{id:4,name:'d'},{id:5,name:'e'}];

console.log(array.some(e => e.name === 'a'));

if (!array.some(e => e.name === 'z')) {
  array.push({id: 5, name: 'z'});
}

console.log(array);

答案 3 :(得分:0)

使用lodash进行此操作可以缩短几个字符,但这是使用 ES6 Array.some的方法:

const array = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }, { id: 5, name: "C" }];

const maybeUpdate = (arr, obj) => {
  if(!array.some(x => x.id == obj.id))
    array.push(obj)
}

maybeUpdate(array, {id: 2, name: "F"})   // id exists wont insert
maybeUpdate(array, {id: 12, name: "F"})  // will insert

console.log(array)

与lodash和_.some相同的想法是:

const array = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }, { id: 5, name: "C" }];

const maybeUpdate = (arr, obj) => {
  if(!_.some(array, {id: obj.id}))
    array.push(obj)
}

maybeUpdate(array, {id: 2, name: "F"})   // id exists wont insert
maybeUpdate(array, {id: 12, name: "F"})  // will insert

console.log(array)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

请注意,您还可以使用其他各种方法来获得相同的结果。 Array.find_.find也可以正常工作,因为您要做的就是检查是否有点击:

const maybeUpdate = (arr, obj) => {
  if(!_.find(array, {id: obj.id})) // or if(!array.find(x => x.id == obj.id))
    array.push(obj)
}