JavaScript求出两个数组的差集,下面是我实现的方法
function arrayDiffSet(a, b) { if ((!a || !a.length) && (b && b.length)) { return b } else if ((!b || !b.length) && (a && a.length)) { return a } var aMap = {}, _aMap = {}, _bMap = {}; for (var i = 0, length = a.length; i < length; i++) { aMap[a[i]] = _aMap[a[i]] = true; } for (var i = 0, length = b.length; i < length; i++) { if (aMap[b[i]]) { delete _aMap[b[i]]; } else { _bMap[b[i]] = true; } } return { a: Object.keys(_aMap), b: Object.keys(_bMap) } } function generateRandomArray(length, range) { var result = []; for (var i = 0; i < length; i++) { result[result.length] = Math.floor(Math.random() * range); } return result } var a = generateRandomArray(5, 10); var b = generateRandomArray(10, 10); console.log('a', a); console.log('b', b); console.time('start'); console.log(arrayDiffSet(a, b)); console.timeEnd('start');
----------但是这个方法还有下面两点:
1、扩展性差,如果我需要返回的差集不去重,那需要再重新写一个方法;
2、没有办法对对象数组求差集;
所以在这里想问问各位大神有没有更优的解决方案
我代码写的不好。
不过求差集好像filter一下就可以了。
至于对象数组。。。太麻烦了,等你先把这个看明白了再说:lodash.isEqual
不使用ES6:
新方法:
另附:jQuery也是可以去重的
var a = [1, 2, 3, 4];
var b = [1, 2, 4, 5];
var c = $(a).not(b);
c = c.toArray(); // [3]