【问题标题】:How to find an array in an array?如何在数组中找到数组?
【发布时间】:2013-10-30 12:10:42
【问题描述】:

如何检查Array 是否包含另一个Array

jQuery 的 $.inArray()array.indexOf([..., ..., ...]) 不起作用..

【问题讨论】:

  • 遍历数组,使用instanceof Array检查
  • 那你就用indexOf! :)

标签: javascript jquery arrays contains


【解决方案1】:

如果您的两个数组都只包含原语(如字符串或数字),最简单的方法可能是遍历数组并比较它们的 string representation

var arr = [ ['one'], ['one', 'three'], ['one', 'two', 'three'] ];
var search = ['one', 'three'];

function arrayInArray(haystack, needle) {
    needle = '' + needle; // needle.toString()
    for(var i = 0; i < haystack.length; i++) {
        if(needle === '' + haystack[i]) {
            return i;
        }
    }
    return -1;
}

console.log(arrayInArray(arr, search));

【讨论】:

    【解决方案2】:

    我看到另一个答案已被接受,但我现在已经输入了这个,所以不妨发布它:)

    比较字符串表示是一个聪明的解决方案,但像这样更“手动”地进行比较可能对不经意的观察者或 6 个月后的你自己更具可读性......

    function isArraysEqual(a, b) {
        if(!a || !b || a === b || a.length !=b.length) {
             return false;
        }
    
        for(var i = 0; i < a.length; ++i) {
            if (a[i] !== b[i]) { 
                return false;
            }
        }
    
        return true;
    }
    
    function arrayContainsArray(parent, child) {
        for(var i = 0; i < parent.length; ++i) {
            var candidate = parent[i];
            if(candidate instanceof Array && isArraysEqual(candidate, child)) {
                return true;
            }
        }
        return false;    
    }
    
    var x = [[1,2,3],[4,5,6],[7,8,9]];
    var y = [4,5,6];
    var z = [10,11,12];   
    
    console.log("should be true: " + arrayContainsArray(x, y));
    console.log("should be false: " + arrayContainsArray(x, z));
    

    【讨论】:

      【解决方案3】:

      一、代码:

      function equal(a, b) {
          if (a == b) return true;
          if (a instanceof Array && b instanceof Array)
              return a.length == b.length && a.every(
                  function (element, index) { return equal(element, b[index]); });
          return false;
      }
      
      function positionIf(array, predicate) {
          for (var i = 0; i < array.length; i++)
              if (predicate(array[i])) break;
          return i;
      }
      
      var x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
      var y = [4, 5, 6];
      var z = [10, 11, 12];
      
      function indexOfArray(array, element) {
          return positionIf(
              array, function (searched) { return equal(searched, element); });
      }
      
      // >>> indexOfArray(x, y);
      // 1
      // >>> indexOfArray(x, z);
      // 3
      

      解释:

      1. 一个通用的equal 函数将是一件好事,不管其他问题。可惜它不在标准库中。但我相信许多流行的多功能库都提供了一个。

      2. Position-if 是执行此类操作的已知习语。您会在许多语言的标准库中找到类似的函数,例如 C++ 或 Common Lisp。有一个很好,但可能某些库已经提供了它,所以检查一下(可能是下划线?)。

      3. 保持代码更通用,为未来的重用创造了潜力。

      4. 返回的索引是超出数组边界的第一个索引,以防找不到任何元素。据我所知,Donald Knuth 首先认为这是一件更合乎逻辑的事情。我不会对此进行辩论,我只是碰巧相信这也是正确的做法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 2021-02-19
        • 1970-01-01
        相关资源
        最近更新 更多