删除数组中重复的未排序对象

Remove duplicate unsorted objects in an array

本文关键字:排序 对象 数组 删除      更新时间:2023-09-26

我有一个这样的数组:

[1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b']
我想

做的是我想从这个数组中删除重复项,无论它们是否是对象,以便最终的数组可以变成这样:

[1, {a: 'b', c: 'd'}, {e: 'f'}, 'b']

我在网站上看到了很多解决方案,但没有一个适用于我的问题。我该怎么做?

我试过这个:

function uniq_fast(a) {
    var seen = {};
    var out = [];
    var len = a.length;
    var j = 0;
    for(var i = 0; i < len; i++) {
         var item = a[i];
         if(seen[item] !== 1) {
               seen[item] = 1;
               out[j++] = item;
         }
    }
    return out;
}

但这也删除了第三个对象。

谢谢。

如果只想比较引用而不是对象的内容,则可以使用:

arr.reduce(function(accumulator, element){
   if (accumulator.indexOf(element) !== -1) return accumulator;
   return accumulator.concat(element);
}, []);

否则,您需要创建一个函数来比较对象的内容,例如:

function objectsMatch(obj1, obj2) {
  if (obj1 === obj2) return true;
  for (var prop in obj1) {
    if (!(prop in obj2) || obj1[prop] !== obj2[prop]) return false; 
  }
  for (var prop in obj2) {
    if (!(prop in obj1)) return false; 
  }
  return true;
}

然后使用类似以下内容:

arr.reduce(function(accumulator, element){
   if (accumulator.some(function(otherElement){
          return objectsMatch(element, otherElement);
       })) return accumulator;
   return accumulator.concat(element);
}, []);

这个函数会为你做。它使用Object.keys()交叉引用对象。如果使用已知键填充 seen,并且已知键内容是 seen 中对象的两倍,则从对象中删除属性。最后,如果对象为空,则使用拼接从数组中删除整个对象。请注意,仅当所有输入都与提供的示例类似时,此解决方案才有效。否则,该函数需要递归编写。

var abc = [1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b'];
function uniq_fast(a) {
    var seen = {};
    var deleteObject = [];
    var len = a.length;
    for(var i = 0; i < len; i++) {
         if (Object.prototype.toString.call(a[i]) === '[object Array]' || Object.prototype.toString.call(a[i]) === '[object Object]')
         {
            var test = Object.keys(a[i]);
            var len2 = test.length;
            for (var j = 0; j < len2; ++j)
            {
                if (seen[test[j]] && a[i][test[j]] === seen[test[j]])
                {
                    delete a[i][test[j]];
                }
                else
                {
                    seen[test[j]] = a[i][test[j]];
                }
            }
            if (Object.keys(a[i]).length == 0)
            {
                deleteObject.push(i);
            }
        }
    }
    for (var i = 0; i < deleteObject.length; ++i)
    {
        a.splice(deleteObject[i], 1);
    }
    return a;
}
console.log(uniq_fast(abc));