【问题标题】:Compare 2 arrays which returns difference比较 2 个返回差异的数组
【发布时间】:2012-06-07 07:46:04
【问题描述】:

比较两个数组并返回差异的最快/最佳方法是什么?很像 PHP 中的 array_diff。是否有一个简单的功能,还是我必须通过each() 创建一个?还是foreach 循环?

【问题讨论】:

标签: javascript jquery arrays array-difference


【解决方案1】:

我知道这是一个老问题,但我想我会分享这个小技巧。

var diff = $(old_array).not(new_array).get();

diff 现在包含 old_array 中没有 new_array 的内容

【讨论】:

  • 又短又甜..就像我喜欢它一样..我用它和$.merge()来连接特定顺序的差异...
  • 如果数组包含对象,这会起作用吗?我正在尝试比较两个数组中的对象
  • 这是一个场景。这适用于$(['h','h','h','h','h']).not($(["a", "a", "a"])),但对于像$(['h','h','h','h','h']).not($(["a", "a", "a", "h"])) 这样的数组(注意数组中的最后一个“h”)它返回一个空数组。不退还差额。因此,它是错误的。
  • @VishnuNarang 我认为您在这里误解了一些事情。首先,数组差分是如何工作的,其次是不阅读 OP 提出的实际问题。让我们处理第一个误解。在第二个示例中返回一个空数组是完全正确的结果。它正在返回第一个数组中的内容,而不是第二个数组中的内容(即什么都没有)。这是第一个数组和第二个数组之间的“差异”。其次,OP 要求像 PHP(array_diff)这样的 jQuery 函数。就是这个!您的示例通过 PHP 的 array_diff() 函数运行也会产生一个空数组
  • @VishnuNarang 我非常有信心 PHP 的 array_diff() 函数没有故障。
【解决方案2】:

工作演示 http://jsfiddle.net/u9xES/

良好的链接(Jquery 文档):http://docs.jquery.com/Main_Page {您可以在此处搜索或阅读 API}

如果您想在 JQuery 中执行此操作,希望这会对您有所帮助。

最后的alert提示不常见元素Array的数组即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 

【讨论】:

  • 这个方法很酷,但是应该考虑array2的长度小于array1的情况
  • 更优雅:简单difference = $.grep(a1,function(x) {return $.inArray(x, a2) < 0})
  • 很好的答案。但是想指出您正在使用.grep,例如.each;应该是difference = $.grep(array2, function(el) { return $.inArray( el, array1 ) == -1; })
  • 老兄,你是爱 :) 我被困了大约 2 天,你把我带到了另一端。
  • 小提琴@Jocelyndelalande 的评论:jsfiddle.net/cqsLvxod
【解决方案3】:

使用下划线:

_.difference(array1,array2)

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @AlSki 它给出了问题的答案!比较两个数组并返回差异。
  • @anurag_29 问题是如何使用 jQuery,而不是下划线。
  • @AlSki 当答案在几年后发布时,我认为,发布一个涉及使用与所问问题不同的库的答案是合适的,因为这是一个可能的答案问题 - 如果 OP 或多年后访问该问题的其他人知道图书馆,不知道一种或另一种方式。
【解决方案4】:
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;
};

【讨论】:

    【解决方案5】:
    /** 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"!
    

    这在所有情况下都有效,并避免了上述方法中的问题。希望对您有所帮助!

    【讨论】:

      【解决方案6】:

      这样你就不用担心第一个数组是否比第二个小了。

      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));
      

      【讨论】:

        【解决方案7】:

        如果您还想比较答案的顺序,您可以将答案扩展为以下内容:

        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;
        }
        

        【讨论】:

          【解决方案8】:

          短版可以是这样的:

          const diff = (a, b) => b.filter((i) => a.indexOf(i) === -1);
          

          结果:

          diff(['a', 'b'], ['a', 'b', 'c', 'd']);
          
          ["c", "d"]
          

          【讨论】:

            【解决方案9】:

            这样的数组操作并不是 jQuery 的强项。您应该考虑使用 Underscorejs 之类的库,特别是差异函数。

            【讨论】:

              【解决方案10】:

              这应该适用于未排序的数组、双精度值以及不同的顺序和长度,同时为您提供来自 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 ]
              

              【讨论】:

                猜你喜欢
                • 2019-08-31
                • 2023-03-03
                • 2023-03-27
                • 2020-02-15
                • 1970-01-01
                • 2017-10-07
                • 1970-01-01
                • 1970-01-01
                • 2015-08-21
                相关资源
                最近更新 更多