【问题标题】:How to check if a specific object already exists in an array before adding it如何在添加之前检查特定对象是否已存在于数组中
【发布时间】:2017-08-26 12:02:03
【问题描述】:

我有这个数组:

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

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

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

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

【问题讨论】:

  • ID 是唯一的吗?
  • 你必须比较对象,通过比较每个属性的值来决定它是否在数组中。 Plain array.includes 将比较参考。
  • 是什么让您将插入的对象称为“相同”?每次创建对象时,JavaScript 总是认为它是不同的。但是,如果您已获取较早插入的对象并想再次插入该对象(不创建新对象),则它们被认为是相同的。

标签: javascript ecmascript-6


【解决方案1】:

如果您的对象是较早创建的并且与数组中的对象具有相同的引用,则可以使用 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;

【讨论】:

    【解决方案2】:

    如果 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】:

      您可以使用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);

      【讨论】:

        【解决方案4】:

        使用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】:

          您可以编写自定义方法将新对象插入数组。在数组中添加新元素之前,首先检查该项目是否存在于数组中。你可以使用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));

          【讨论】:

            【解决方案6】:

            可能一个 id -> object 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
            );
            

            【讨论】:

              【解决方案7】:

              一个非常冗长的方法是这样的:

              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);
              }
              

              【讨论】:

              • 只是构造函数按照惯例以大写字母开头。
              • 真的吗?不知道。有官方的约定参考吗?
              • 大多数变量和函数应该以小写字母开头。必须与新前缀一起使用的构造函数应以大写字母开头。如果省略了必需的 new,JavaScript 既不会发出编译时警告,也不会发出运行时警告。如果不使用 new 可能会发生坏事,因此大写约定是我们唯一的防御措施。浏览器中的全局变量应全部大写。 javascript.crockford.com/code.html
              • 在几年的 C、C++、Python、Java、Javascript、HTML、Matlab 等编程中。我总是只使用规则,函数是小写的,变量必须以大写字母开头.你是第一个抱怨这个的人。还是这只特定于Javascript?
              【解决方案8】:

              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 我不明白
              猜你喜欢
              • 2010-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-16
              • 2013-04-11
              • 1970-01-01
              • 2020-07-25
              相关资源
              最近更新 更多