比较2个返回差异的数组
比较两个数组并返回差异的最快/最好的方法是什么? 很像在PHP中的array_diff
。 有一个简单的函数,或者我将不得不通过each()
创build一个? 或者一个foreach
循环?
工作演示 http://jsfiddle.net/u9xES/
良好的链接(JQuery文档): http : //docs.jquery.com/Main_Page {你可以在这里search或阅读API}
希望这会帮助你,如果你正在寻找在JQuery做到这一点。
最后的警报提示非常规元素数组的数组,即2个数组之间的差异。
请让我知道如果我错过了什么,欢呼!
码
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
我知道这是一个古老的问题,但我想我会分享这个小窍门。
var diff = $(old_array).not(new_array).get();
diff
现在包含old_array
中不在new_array
使用下划线作为:
_.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; };
如果您还想比较答案的顺序,则可以将答案扩展为如下所示:
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; } else { 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));
/** 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"!
这在所有情况下都可以工作,并且避免了上述方法中的问题。 希望有所帮助!
像这样的数组操作不是jQuery的最强点。 你应该考虑一个像Underscorejs这样的库,特别是差异函数。
这应该与未sorting的数组,double值和不同的顺序和长度一起工作,同时为您提供array1,array2或两者的过滤值。
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,你可以使用这个轻量级的数组 -开源组件。
例:
diff([1,2,3], [1,2,3,4,5]) // => [4,5]
它通过对传递的两个数组进行级联,并过滤包含的vals,返回一个表示两个数组之间差异的数组。