如何快速/最好地比较两个数组并返回它们之间的差异?就像PHP中的array_diff
一样。是否有一个简单的函数可以实现,还是我需要通过each()
或foreach
循环来创建一个函数?
如何快速/最好地比较两个数组并返回它们之间的差异?就像PHP中的array_diff
一样。是否有一个简单的函数可以实现,还是我需要通过each()
或foreach
循环来创建一个函数?
我知道这是一个老问题,但是我想分享一下这个小技巧。
var diff = $(old_array).not(new_array).get();
diff
现在包含了 old_array
中不在 new_array
中的内容
$.merge()
一起使用,以特定顺序连接差异... - kingkode$(['h','h','h','h','h']).not($(["a", "a", "a"]))
这个数组,它运行得很好,但是对于像$(['h','h','h','h','h']).not($(["a", "a", "a", "h"]))
(注意数组中的最后一个"h")这样的数组,它返回一个空数组。差异没有被返回。因此,它是有问题的。 - Vishnu Narang好的链接(JQuery文档):http://docs.jquery.com/Main_Page{你可以在这里搜索或阅读API}
如果你想用JQuery实现这个功能,希望这对你有所帮助。
最后的提示框会显示两个数组之间不同的元素所组成的数组。
如果我漏掉了什么,请告诉我,谢谢!
代码
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
difference = $.grep(a1, function(x) { return !$.inArray(x, a2); });
。这样可以得到a1数组中所有不在a2中出现的元素集合,而不需要使用小于零的比较运算符。 - Jocelyn delalande.grep
像 .each
一样;应该是 difference = $.grep(array2, function(el) { return $.inArray( el, array1 ) == -1; })
。 - PeterKA将下划线用作:
_.difference(array1,array2)
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;
};
/** 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"!
简单来说,可以这么说:
最初的回答:
const diff = (a, b) => b.filter((i) => a.indexOf(i) === -1);
result:
diff(['a', 'b'], ['a', 'b', 'c', 'd']);
["c", "d"]
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));
这样的数组操作并不是jQuery的强项。您应该考虑使用一个像Underscorejs这样的库,尤其是差异函数。
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 ]
inArray
函数并填充两个数组之间的差异;我已经为你粘贴了一个可工作的演示,希望能对你有所帮助 B-) - Tats_innit