Какой самый быстрый/лучший способ сравнить два массива и вернуть разницу? Очень похоже на array_diff
в PHP. Есть ли простая функция, или мне нужно будет создать ее через each()
? или цикл foreach
?Сравнить 2 массива, которые возвращают разницу
ответ
Работа демоhttp://jsfiddle.net/u9xES/
Хорошей ссылка (Jquery Документация): http://docs.jquery.com/Main_Page {вы можете искать или читать API, здесь}
Надеется, что это поможет вам, если вы хотите сделать это в JQuery.
Предупреждение в конце вызывает массив необычного элемента Array i.e. Разница между двумя массивами.
Пожалуйста, дайте мне знать, пропустил ли я что-нибудь, ура!
Код
var array1 = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var difference = [];
jQuery.grep(array2, function(el) {
if (jQuery.inArray(el, array1) == -1) difference.push(el);
});
alert(" the difference is " + difference); // Changed variable name
Этот метод классный, но должен учитывать случай, если длина массива меньше, чем array1 –
Более элегантно: просто 'разность = $ .grep (a1, function (x) {return $ .inArray (x, a2) <0}) ' –
Отличный ответ. Однако хотелось бы указать, что вы используете '.grep' как' .each'; должен быть 'difference = $ .grep (array2, function (el) {return $ .inArray (el, array1) == -1;})' – PeterKA
Операции с массивами, как это не самая сильная точка jQuery. Вы должны рассмотреть библиотеку, такую как Underscorejs, в частности функцию разности.
var arrayDiff = function (firstArr, secondArr) {
var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len;
if (fLen > sLen) {
len = sLen;
} else if (fLen < sLen) {
len = fLen;
} else {
len = sLen;
}
for (i=0; i < len; i++) {
if (firstArr[i] !== secondArr[i]) {
o.push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index
}
}
if (fLen > sLen) { // first > second
for (i=sLen; i< fLen; i++) {
o.push({idx: i, 0: firstArr[i], 1: undefined});
}
} else if (fLen < sLen) {
for (i=fLen; i< sLen; i++) {
o.push({idx: i, 0: undefined, 1: secondArr[i]});
}
}
return o;
};
Я знаю, что это старый вопрос, но я думал, что я разделю эту маленькую хитрость.
var diff = $(old_array).not(new_array).get();
diff
теперь содержит то, что было в old_array
, что не в new_array
короткий и сладкий .. просто как мне нравится .. Я использовал это с '$ .merge()' для конкатенации различий в определенном конкретном порядке ... – kingkode
будет работать, если массив содержит объекты? Я пытаюсь сравнить объекты в двух массивах – Batman
Вот сценарий. Это отлично работает для '$ (['h', 'h', 'h', 'h', 'h']). Not ($ ([" a "," a "," a "]))' но для массива типа '$ (['h', 'h', 'h', 'h', 'h']). not ($ ([" a "," a "," a "," h "]))' (УВЕДОМЛЕНИЕ о последнем «h» в массиве), он возвращает пустой массив. Разница не возвращается. Следовательно, он неисправен. –
, если вы хотите, чтобы сравнить порядок ответа вы можете продлить ответ на что-то вроде этого:
Array.prototype.compareTo = function (array2){
var array1 = this;
var difference = [];
$.grep(array2, function(el) {
if ($.inArray(el, array1) == -1) difference.push(el);
});
if(difference.length === 0){
var $i = 0;
while($i < array1.length){
if(array1[$i] !== array2[$i]){
return false;
}
$i++;
}
return true;
}
return false;
}
Таким образом, вам не нужно беспокоиться о том, если первый массив меньше второго.
var arr1 = [1, 2, 3, 4, 5, 6,10],
arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function array_diff(array1, array2){
var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0});
return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));;
}
console.log(array_diff(arr1, arr2));
использование подчеркивания, как:
_.difference(array1,array2)
Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – AlSki
@AlSki дает ответ на заданный вопрос! сравнивает два массива и возвращает diff. –
@ anurag_29 Вопрос состоял в том, как это сделать с помощью jQuery, а не с подчеркиванием. – reergymerej
/** SUBTRACT ARRAYS **/
function subtractarrays(array1, array2){
var difference = [];
for(var i = 0; i < array1.length; i++) {
if($.inArray(array1[i], array2) == -1) {
difference.push(array1[i]);
}
}
return difference;
}
Вы можете вызвать функцию в любом месте вашего кода.
var I_like = ["love", "sex", "food"];
var she_likes = ["love", "food"];
alert("what I like and she does't like is: " + subtractarrays(I_like, she_likes)); //returns "Naughty"!
Это работает во всех случаях и позволяет избежать проблем в вышеприведенных методах. Надеюсь, это поможет!
Это должно работать с несортированными массивами, двойными значениями и разными порядками и длиной, предоставляя вам отфильтрованные значения формы array1, array2 или both.
function arrayDiff(arr1, arr2) {
var diff = {};
diff.arr1 = arr1.filter(function(value) {
if (arr2.indexOf(value) === -1) {
return value;
}
});
diff.arr2 = arr2.filter(function(value) {
if (arr1.indexOf(value) === -1) {
return value;
}
});
diff.concat = diff.arr1.concat(diff.arr2);
return diff;
};
var firstArray = [1,2,3,4];
var secondArray = [4,6,1,4];
console.log(arrayDiff(firstArray, secondArray));
console.log(arrayDiff(firstArray, secondArray).arr1);
// => [ 2, 3 ]
console.log(arrayDiff(firstArray, secondArray).concat);
// => [ 2, 3, 6 ]
Вместо того, чтобы тянуть весь Lodash вы можете использовать этот легкий array-diff компонент с открытым исходным кодом.
Пример:
diff([1,2,3], [1,2,3,4,5]) // => [4,5]
Он работает concating два массива, переданные и фильтрации включены Vals, возвращая массив, представляющий разницу между двумя массивами.
Hiya man, я считаю, вы можете использовать 'inArray' и заполнить разницу между 2 массивами; Я вложил в нее рабочую демоверсию, надеюсь, что это поможет B-) –
дубликат http://stackoverflow.com/questions/1187518/javascript-array-difference (даже если он уже был где-то там где-то связан) – cregox
You вероятно, хочу [этот ответ из прошлого вопроса SO] (http://stackoverflow.com/a/4026828/304588). Он основывается на прототипе Array. –