【问题标题】:Find duplicate values inside array of objects在对象数组中查找重复值
【发布时间】:2016-04-17 11:13:16
【问题描述】:

在 JavaScript 中检查对象数组并检查数组对象的属性之一中是否已经存在某个值的最佳方法是什么? 例如:我有如下对象数组: [{name:"team1",members:3},{name:"bestteam",members:4}] 现在我想添加一个新对象,但我想在添加之前检查该对象属性“名称”在数组中是否不存在

【问题讨论】:

标签: javascript


【解决方案1】:

您可以使用简单的循环。这是一个函数,可以帮助您找出键值是否在数组中。

function keyExist(value, array) {
    for(var i in array) {
        for(var k in array[i])
            if(array[i][k] === value) {
                console.log(value + ' is in array!');

                return true;
            }
    }

    return false;
}

至于你的例子,你可以改变第二个循环

for(var k in array[i])
    if(k === value) { return true; }

if(array[i].name === value) { return true; }

【讨论】:

    【解决方案2】:

    我没有时间回应,但从我之前的代码来看,也许有些人会对其进行优化...

     function JSONRemoveDuplicates(JSONDATA) {
        var uniqueNames = [];
        $.each(JSONDATA, function (i, el) {
            if (!existInJSON(uniqueNames, el) > 0) { uniqueNames.push(el); }
        });
        return uniqueNames;
    }
    
    
    function existInJSON(jsondata, el) {
        var ret = 0;
        $(jsondata).each(function (index, data) {
            if (data.id == el.id)
                ret++;
        })
        return ret > 0;
    }
    

    【讨论】:

      【解决方案3】:

      假设你说一个对象等于一个对象当且仅当它们具有完全相同的元素和每个元素的值:

      var map = {};
      for (var i = 0; i < arr.length; i++) {
          var index = JSON.stringify(arr[i]);
          if (!map[index]) {
              map[index] = 1;
          } else {
              map[index]++;
          }
      }
      for (var key in map) {
          if (map[key] > 1) {
              console.log ('duplicate found for:');
              console.log (JSON.parse (key));
          }
      }
      

      只需用一些对象定义一个数组“arr”并检查一下

      【讨论】:

        【解决方案4】:

        您可以遍历数组并遍历数组的键并检查某些属性是否具有所需的值。

        var data = [{ prop1: 'one', prop2: 'two' }, { prop3: 'three', prop4: 'four' }];
        
        function find(v, data) {
            data.forEach(function (a, i) {
                Object.keys(a).forEach(function (k) {
                    if (a[k] === v) {
                        document.write(v + ' found in [' + i + '].' + k);
                    }
                });
            });
        }
        
        find('three', data);

        【讨论】:

          【解决方案5】:

          试试这个

          function checkIfNameExists(arr, newName) {
              return arr.some(function(e) {
                  return e.name === newName;
              });
          }
          

          其中 arr 是您的数组,newName 是要检查的名称。

          您还可以通过将要比较的属性作为参数传递来减少临时性,就像这样

          function checkIfNameExists(arr, prop, newVal) {
              return arr.some(function(e) {
                  return e[prop] ? e[prop] === newVal : false;
              });
          }
          

          【讨论】: