如何快速地对比出这两个数组中不是同时存在的元素。
目测答案是:"574a97fe2b51e90056e423c0"
var arr1 = [
"574417bc79df540065d92df7",
"574424e5df0eea0063adefc6",
"57442329a3413100625f194f",
"5744242bc4c971005d5ff04e",
"574a841d1532bc006068c6c9",
"574a97fe2b51e90056e423c0"
];
var arr2 = [
"574417bc79df540065d92df7",
"57442329a3413100625f194f",
"5744242bc4c971005d5ff04e",
"574424e5df0eea0063adefc6",
"574a841d1532bc006068c6c9"
];
异或操作,对应的位相同为0,不同为1?
空间足够的话,做个hash表映射一下喽:
const ans = [], temp = {};
for(let i = 0; i < arr1.length; i++) {
temp[arr1[i]] = true;
}
for(let i = 0; i < arr2.length; i++) {
if(!temp.hasOwnProperty(arr2[i])) {
ans.push(arr2[i]);
}
}
比较初级的哈哈,
var lessArr,maxArr;
if(arr1.length>arr2.length) {
lessArr = arr2;
maxArr = arr1;
}else{
lessArr = arr1;
maxArr = arr2;
}
var lessStr = lessArr.join('|');
var diffArr = [];
for(var i=0;i<maxArr.length;i++) {
if(lessStr.indexOf(maxArr[i]) == -1) {
diffArr.push(maxArr[i]);
}
}
console.log(diffArr.join(','));
采用es6的Set结构
var set = new Set(arr2);
arr1.filter(v=>!set.has(v));
也就循环了吧?
其实题主的问题应该是问如何找出两个数组之间的差集。
如果是生产环境下,我会引入lodash
这个工具库(如果是java的话引入guava
库),然后用以下代码实现该需求:
var arr1 = [1,2,3];
var arr2 = [1,4,5];
_.difference(arr1, arr2); //返回存在于arr1中,而不存在于arr2中的元素集合
// return [2,3]
或
_.xor(arr1, arr2); //返回arr1和arr2中除共同元素外的所有元素集合
// return [2,3,4,5]
看了一下lodash
里面difference
的实现,核心内容大概就是arr1正向遍历,arr2逆向遍历,我试着写了一下:
function difference1(arr1, arr2) {
var result = [];
for(var i = 0, length = arr1.length; i < length;i++) {
var value = arr1[i];
for(var j = arr2.length - 1;j >= 0; j--) {
if (value === arr2[j]) {
j = NaN;
break;
}
}
if (!isNaN(j) && result.indexOf(value) === -1) {
result.push(value);
}
}
return result;
}
// 并不能确定difference1和difference2的性能是否相等
function difference2(arr1, arr2) {
var result = [];
for(var i = 0, length = arr1.length; i < length; i++) {
var value = arr1[i];
if (arr2.indexOf(value) === -1) {
result.push(value);
}
}
return result;
}
当然,这段代码还有很多可以优化的地方,例如剔除arr2中已经相等的元素,这里就不写了。