如何检查是否一个特定的对象数组已经存在添加它之前

问题描述:

我有此数组:如何检查是否一个特定的对象数组已经存在添加它之前

[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }] 

现在我的目标是防止再次添加相同的对象数组:

{"name": "Olvier", "id": 123 } 

有没有一种方法可以做到这一点?

+1

是IDS独特之处? –

+0

您必须通过比较每个属性的值来比较对象,以确定它是否在数组中。普通'array.includes'将比较参考。 – Nisarg

+0

是什么让你调用插入的对象“相同”?每次创建一个对象时,JavaScript总是被认为是不同的。但是,如果您已经插入了较早插入的对象并且想要再次插入该对象(不创建新对象),那么它们被认为是相同的。 – trincot

如果你的对象是先前创建并具有相同的参考为一个数组中,你可以使用的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 
 
}

+0

@Jonasw我没有得到它 – Sajeetharan

重新创建阵列Array#reduceArray#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); 
} 
+0

只是构造函数按照惯例以大写字母开头。 –

+0

真的吗? 不知道。 是否有官方公约参考? –

+0

*大部分变量和函数都应以小写字母开头。 必须与新前缀一起使用的构造函数应以大写字母开头。如果省略了所需的新的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);