我会使用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来进行演示。