如何在添加之前检查数组中是否已存在特定对象

时间:2017-08-26 12:02:03

标签: javascript ecmascript-6

我有这个数组:

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

现在我的目标是阻止将同一个对象再次添加到数组中:

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

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

8 个答案:

答案 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));