我有对象的数组
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维数组,感谢阿伦),或者至少对其他问题解决方案在我的情况不工作。
香草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
普通的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));
请尝试使用以下内容:
list = list.filter((elem, index, self) => self.findIndex(
(t) => {return (t.x === elem.x && t.y === elem.y)}) === index)
我会用的组合Arrayr.prototype.reduce
和Arrayr.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发挥它。
检查是否已经在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>');
下面的工作:
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 } ]