我有这个数组:
[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
现在我的目标是阻止将同一个对象再次添加到数组中:
{"name": "Olvier", "id": 123 }
有没有方法可以做到这一点?
答案 0 :(得分:3)
如果您的对象是先前创建的并且与数组中的对象具有相同的引用,则可以使用indexOf:
var myObj = { a: 'b' };
myArray.push(myObj);
var isInArray = myArray.indexOf(myObj) !== -1;
否则你可以用find查看:
var isInArray = myArray.find(function(el){ return el.id === '123' }) !== undefined;
答案 1 :(得分:1)
您可以使用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);
答案 2 :(得分:0)
如果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);
答案 3 :(得分:0)
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
}
答案 4 :(得分:0)
使用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)
答案 5 :(得分:0)
可能是id - >对象Map是更好的数据结构。你可以为它实现一个包装器:
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
);
答案 6 :(得分:0)
一种非常冗长的方式就是这样:
uses IdHashMessageDigest, idHash, Classes;
...
function cc_MD5File(const p_fileName : string) : string;
//returns MD5 has for a file
var
v_idmd5 : TIdHashMessageDigest5;
v_fs : TFileStream;
v_hash : T4x4LongWordRecord;
begin
v_idmd5 := TIdHashMessageDigest5.Create;
v_fs := TFileStream.Create(p_fileName, fmOpenRead OR fmShareDenyWrite) ;
try
v_hash := v_idmd5.HashValue(v_fs);
result := v_idmd5.AsHex(v_hash);
finally
v_fs.Free;
v_idmd5.Free;
end;
end;
答案 7 :(得分:0)
您可以编写自定义方法将新对象插入到数组中。在数组中添加新元素之前,首先检查数组中是否存在该项。您可以使用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));