function array_diff (array) { // Computes the difference of arrays
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
var arr_dif = [], i = 1, argc = arguments.length, argv = arguments, key, key_c, found=false;
// loop through 1st array
for ( key in array ){
// loop over other arrays
for (i = 1; i< argc; i++){
// find in the compare array
found = false;
for (key_c in argv[i]) {
if (argv[i][key_c] == array[key]) {
found = true;
break;
}
}
if(!found){
arr_dif[key] = array[key];
}
}
}
return arr_dif;
}
// не понимаю почему данный код
// возврощаеет пустые элементы
// хотя если использую текст вместо цифр все нормально
nu = [1, 2, 3, 4, 5 , 6 ,7 ];
ou = [1, 2, 3, 4, 5 ];
arr = array_diff( nu , ou );
alert(arr.toString() ); // ,,,,,6,7
// имелось ввиду такой текст
array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
В этой функции есть ошибка по сравнению с php вариантом если передавать в нее несколько массивов но функция работает не корректно.
Переписывал ее расширяя прототип.
написал такую функцию, работает быстрее, и если заменить
if (!has) {
arr[i] = cur;
}
на
if (!has) {
arr[arr.length] = cur;
}
то элементы будут вставлены без индекса
function arr_diff(arr1, arr2) {
var arr = [];
var newArr = [];
var argumentsLength = arguments.length;
var newArrLen = 0;
for (var o = 1; o < argumentsLength; o++) {
newArr = newArr.concat(arguments[o]);
}
newArrLen = newArr.length;
for (var i = 0; i < arr1.length; i++) {
var cur = arr1[i];
var has = false;
for (var j = 0; j < newArrLen; j++) {
if (cur == newArr[j]) {
has = true;
}
}
if (!has) {
arr[i] = cur;
}
}
return arr;
}