对象数组的Javascript中删除重复对象数组的Javascript中删除重复(Remove du

2019-05-12 02:28发布

我有对象的数组

list = [{x:1,y:2}, {x:3,y:4}, {x:5,y:6}, {x:1,y:2}]

而我在寻找一种有效的方式(如果可能的话O(log(n)) ),以消除重复,并落得

list = [{x:1,y:2}, {x:3,y:4}, {x:5,y:6}]

我试过_.uniq甚至_.contains ,但无法找到一个令人满意的解决方案。

谢谢!

编辑:问题已被确定为一个又一个的副本。 我看到了这个问题,在发布前,但它并没有回答我的问题,因为它是对象的数组(而不是2维数组,感谢阿伦),或者至少对其他问题解决方案在我的情况不工作。

Answer 1:

香草JS版本:

function dedupe(arr) {
  return arr.reduce(function (p, c) {

    // create an identifying id from the object values
    var id = [c.x, c.y].join('|');

    // if the id is not found in the temp array
    // add the object to the output array
    // and add the key to the temp array
    if (p.temp.indexOf(id) === -1) {
      p.out.push(c);
      p.temp.push(id);
    }
    return p;

  // return the deduped array
  }, { temp: [], out: [] }).out;
}

dedupe(list);

DEMO



Answer 2:

普通的JavaScript(ES2015),使用Set

 var list = [{ x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 1, y: 2 }]; var uniq = new Set(list.map(e => JSON.stringify(e))); var res = Array.from(uniq).map(e => JSON.parse(e)); document.write(JSON.stringify(res)); 



Answer 3:

请尝试使用以下内容:

list = list.filter((elem, index, self) => self.findIndex(
    (t) => {return (t.x === elem.x && t.y === elem.y)}) === index)


Answer 4:

我会用的组合Arrayr.prototype.reduceArrayr.prototype.some方法与传播运营商。

1.明确的解决方案 。 基于数组对象包含了完整的知识。

list = list.reduce((r, i) => 
  !r.some(j => i.x === j.x && i.y === j.y) ? [...r, i] : r
, [])

在这里,我们对比较的对象结构严格限制: {x: N, y: M}[{x:1, y:2}, {x:1, y:2, z:3}]将被过滤以[{x:1, y:2}]

2.通用的解决方案, JSON.stringify() 比较对象可以有任意数量的任何属性。

list = list.reduce((r, i) => 
  !r.some(j => JSON.stringify(i) === JSON.stringify(j)) ? [...r, i] : r
, [])

这种方法有一个限制对属性顺序,因此[{x:1, y:2}, {y:2, x:1}]不会被过滤。

3.通用的解决方案, Object.keys() 顺序并不重要。

list = list.reduce((r, i) => 
  !r.some(j => !Object.keys(i).some(k => i[k] !== j[k])) ? [...r, i] : r
, [])

这种方法有另一个限制:比较的对象必须有钥匙的相同的列表。 所以[{x:1, y:2}, {x:1}]将被尽管有明显差过滤。

4.通用的解决方案, Object.keys() + .length

list = list.reduce((r, i) => 
  !r.some(j => Object.keys(i).length === Object.keys(j).length 
    && !Object.keys(i).some(k => i[k] !== j[k])) ? [...r, i] : r
, [])

有了上次的做法对象正在由按键,通过按键本身的数量和关键值进行比较。

我创建了一个Plunker发挥它。



Answer 5:

检查是否已经在O(n)的一个temorary对象之后过滤该阵列。

 var list = [{ x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 1, y: 2 }], filtered = function (array) { var o = {}; return array.filter(function (a) { var k = ax + '|' + ay; if (!o[k]) { o[k] = true; return true; } }); }(list); document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>'); 



Answer 6:

下面的工作:

var a = [{x:1,y:2}, {x:3,y:4}, {x:5,y:6}, {x:1,y:2}];

var b = _.uniq(a, function(v) { 
    return v.x && v.y;
})

console.log(b);  // [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 } ]


文章来源: Remove duplicates in an object array Javascript