如何提取嵌套数组/对象数组中的所有唯一值(去重)
处理包含嵌套数组/对象的数组去重问题
我发现现有的多数数组去重方案都没法处理嵌套数组或者嵌套对象数组的场景,所以需要实现一个能兼容基础类型、嵌套数组、嵌套对象的通用去重方法。
示例场景
源数组:
[ 1, 0, true, undefined, null, false, ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'c', 'b'], { a: { b: 2 } }, { a: { b: 2 } }, { a: { b: 3 } }, { a: { b: undefined } }, { a: { } }, { a: { b: 3, c: undefined } }, ]
期望返回结果:
[ 1, 0, true, undefined, null, false, ['a', 'b', 'c'], ['a', 'c', 'b'], { a: { b: 2 } }, { a: { b: 3 } }, { a: { b: undefined } }, { a: { } }, { a: { b: 3, c: undefined } }, ]
尝试过的失败方案
- 第三方库
arr-unique:能处理普通对象数组,但对嵌套数组无能为力 - ES6的
Set:同样无法识别嵌套结构的相等性 - 原生
filter+indexOf组合:也只能处理基础类型,嵌套结构会被当作不同引用
对应的失败代码:
console.log(array_unique(data)); console.log([...new Set(data)]); console.log(data.filter(function (el, index, arr) { return index == arr.indexOf(el); }));
解决方案
我自己开发了一个专门处理这类场景的模块array-hyper-unique,它没有使用JSON.stringify来序列化判断(避免了正则表达式相关的bug),可以完美处理包含基础类型、嵌套数组、嵌套对象的数组去重需求。
内容的提问来源于stack exchange,提问作者bluelovers
相关产品推荐
相关产品推荐

