我正在使用Lodash。我有下面的数组:
const array = [{id:1,name:a},{id:2,name:b},{id:3,name:c},{id:4,name:d},{id:5,name:e}];
,我要向该数组添加另一个对象,但是在此之前,我需要检查新对象的名称是否已经在数组中,以及是否有一个名称不添加新对象的对象。反对了。
我知道一些方法,例如,使用_.map
循环,但想确保是否有更简单的方法。
答案 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)
}