Вот код с комментариями, объясняя, что происходит и выход
var arr1 = [1,2,'foo','bar'];
var arr2 = [2,3,'foo'];
var diff = diff(arr1, arr2);
console.log(diff); // ["1", "3", "bar"]
function diff(arr1, arr2) {
var newArr = [];
var a=[];
// Loop through arr1
// set the value of each entry as an index in array `a`
// set the value of the entry in `a` to true
for(var i=0;i<arr1.length;i++)
a[arr1[i]]=true;
// console.log(a); // [1: true, 2: true, foo: true, bar: true]
// Loop through arr2
// check if each entry exists as an index in array `a`
// if it does, delete the value from array `a`
// if not, set the value of the entry in `a` to true
for(var j=0;j<arr2.length;j++)
if(a[arr2[j]])
delete a[arr2[j]];
else
a[arr2[j]]=true;
// console.log(a); // [1: true, 3: true, bar: true]
// put all of the indexs of array `a` to values in `newArr`
for(var k in a)
newArr.push(k);
return newArr;
}
http://jsfiddle.net/daCrosby/6rcf1j72/
образца С кодовой очисткой стороны, если вы хотите более короткую функцию, которую вы могли бы использовать что-то вроде одного из них:
console.log("Looping", diffLoop); // [1, "bar", 3]
console.log("Filtering", diffFilter); // [1, "bar", 3]
function diffLoop(arr1, arr2){
var arr = arr1;
for(var j=0; j<arr2.length; j++)
if(arr.indexOf(arr2[j]) > -1)
arr.splice(arr.indexOf(arr2[j]), 1);
else
arr.push(arr2[j]);
return arr;
}
function diffFilter(arr1, arr2){
var arr = arr1.concat(arr2);
return arr.filter(function(i) {
var in1 = arr1.indexOf(i) < 0;
var in2 = arr2.indexOf(i) < 0;
return (in1 || in2) && !(in1 && in2);
});
}
http://jsfiddle.net/daCrosby/6rcf1j72/1/
Существуют эквивалентные конструкции как на C, так и на C++, о которых вы заявляете. – Blindy
@Blindy: В других C, C++ мы обычно предоставляем индекс массива внутри '[]'. Странно видеть массив как индекс внутри другого массива. –
Это индексы. Я не понимаю, что вводит в заблуждение, вы индексируете 'a' с' arr1 [i] ', снова идентичным их эквивалентным конструкциям C и C++. – Blindy