2 回答
TA贡献1865条经验 获得超7个赞
首先谈下我的理解,不可能有一劳永逸的方法。
同意楼上去除复杂引用类型本身就是一个高度自定化的功能,需要自身去定义,按你的说法,
1.待去重数组内的类型是不确定的
2.不同的类型,甚至你自己定义的class,都有不同的"相等"的含义,比如定义user的类,只需id一样。
在java 中,判断对象相等需要重写equals和hashCode方法,equals返回true就是相等了,现在连类都未知,怎么去实现它的equals方法呢?
ps:
感觉实际开发中这种包罗万象的数组存在的可能性微乎其微,可以参考下lodash的unionWith 函数_.unionWith([arrays], [comparator])
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; _.unionWith(objects, others, _.isEqual);// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
把判断是否相等的代码comparator
作为参数,如果有多种类型,就在comparator
里面加个类型判断就好了。
TA贡献1775条经验 获得超11个赞
这个可以看一下 lodash
的 baseUniq 源码
有 array , iteratee, comparator
, 数组,迭代器,比较器3个参数
function baseUniq(array, iteratee, comparator) {...}
这一个方法演化了 union, uniq, unionBy, uniqBy, unionWith, uniqWith
6个方法
如果我们比较 [ { age: 1 }, { age: 1 } ]
是否重复可以 使用 iteratee
:item => item.age
如果我们比较 [ { 'x': 1, 'y': 2 }, { 'x': 1, 'y': 2 } ]
是否重复可以 使用 comparator
:(target, value) => target.x === value.x && target.y === value.y
(也可以用其他的方法,遍历,JSON.stringify
)
添加回答
举报