如何检查是否一个特定的对象数组已经存在添加它之前
我有此数组:如何检查是否一个特定的对象数组已经存在添加它之前
[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
现在我的目标是防止再次添加相同的对象数组:
{"name": "Olvier", "id": 123 }
有没有一种方法可以做到这一点?
如果你的对象是先前创建并具有相同的参考为一个数组中,你可以使用的indexOf:
var myObj = { a: 'b' };
myArray.push(myObj);
var isInArray = myArray.indexOf(myObj) !== -1;
否则,你可以找一下:
var isInArray = myArray.find(function(el){ return el.id === '123' }) !== undefined;
如果ID是唯一的,你可以简单地检查是否有某个ID的对象存在:
const collection = [
{"name": "Olvier", "id": 123 },
{"name": "Olvier", "id": 124 }
];
let person = { "name": "Olvier", "id": 123 };
function addPerson(person) {
const existingIds = collection.map((addedPerson) => addedPerson.id);
if (! existingIds.includes(person.id)) {
collection.push(person);
}
}
addPerson(person);
var myarray = [{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }];
var myobj =
{"name": "Olvier", "id": 123 };
var result = myarray.filter(function (item) {
return (item.name == myobj.name && item.id == myobj.id);
});
if(result.length==0){
//add here
}
@Jonasw我没有得到它 – Sajeetharan
重新创建阵列Array#reduce
与Array#filter
var arr =[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
var res = arr.reduce((a,b)=>{
if(a.filter(i=> i.name == b.name).length == 0){
a.push(b)
}
return a
},[])
console.log(res)
检查大概一个id - >对象地图是在这里更好的数据结构。你可以实现一个包装它:
class UserList extends Map {
constructor(arr){
super(arr.map(obj => [obj.id,obj]));
}
add(obj){
if(!this.has(obj.id)){
return this.set(obj.id,obj);
}
return false
}
remove(obj){
this.delete(obj.id || obj);
}
}
var users = new UserList([{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]);
console.log(
users.add({name:"Jack",id:123}),//false
users.add({name:"Jack",id:125}),//works
users.delete(124),//removes Olvier
users.get(125),//Jack
[...users.entries()],//a 2d array of [id,obj]
[...users.values()]//objects only array
);
做的非常详细的办法是某事像:
var IsIncluded = false;
for(var i; i< array.length; i++) {
if(array[i].name == ObjectToInclude.name && array[i].id == ObjectToInclude.id) {
IsIncluded = true;
break;
}
}
if(!IsIncluded) {
array.push(ObjectToInclude);
}
只是构造函数按照惯例以大写字母开头。 –
真的吗? 不知道。 是否有官方公约参考? –
*大部分变量和函数都应以小写字母开头。 必须与新前缀一起使用的构造函数应以大写字母开头。如果省略了所需的新的JavaScript,则JavaScript不会发出编译时警告或运行时警告。如果不使用新功能,可能会发生坏事,所以资本化惯例是我们唯一的防御。 浏览器中的全局变量应该全部大写。* http://javascript.crockford.com/code.html –
您可以编写自定义方法插入新的对象到数组。在数组中添加新元素之前,首先检查数组中是否存在该项目。您可以使用array#some
var arr = [{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }];
var obj1 = {"name": "Olvier", "id": 123 }, obj2 = {"name": "Olvier", "id": 125 };
var insertUniqueObject = function(arr, obj) {
let isExist = arr.some(o => o.name === obj.name && o.id === obj.id);
if(!isExist)
arr.push(obj);
return arr;
}
console.log(insertUniqueObject(arr, obj1));
console.log(insertUniqueObject(arr, obj2));
你可以使用Array#some方法来确定的该项目已在阵与否:
var arr = [
{ name: 'Olvier', id: 123 },
{ name: 'Olvier', id: 124 }
];
var existingItem = arr[1];
var newItem = { name: 'John', id: 125 };
if (!arr.some(item => item === existingItem)) {
arr.push(existingItem);
}
console.log(arr);
if (!arr.some(item => item === newItem)) {
arr.push(newItem);
}
console.log(arr);
是IDS独特之处? –
您必须通过比较每个属性的值来比较对象,以确定它是否在数组中。普通'array.includes'将比较参考。 – Nisarg
是什么让你调用插入的对象“相同”?每次创建一个对象时,JavaScript总是被认为是不同的。但是,如果您已经插入了较早插入的对象并且想要再次插入该对象(不创建新对象),那么它们被认为是相同的。 – trincot