【问题标题】:javascript search array of arraysjavascript搜索数组数组
【发布时间】:2011-09-12 23:57:06
【问题描述】:

假设我们有以下 js 数组

var ar = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

var val = [3,566,23,79];

是否有一个 js 内置函数或 jQuery 函数,您可以使用它在数组 ar 中搜索 val

谢谢

***更新*************

根据 fusion 的响应,我创建了这个原型

Array.prototype.containsArray = function(val) {
    var hash = {};
    for(var i=0; i<this.length; i++) {
        hash[this[i]] = i;
    }
    return hash.hasOwnProperty(val);
}

【问题讨论】:

  • 只想添加一个小评论,将this.length 移到循环之外会提高效率。像这样,例如:for (var i = this.length &gt; 0 ? (this.length - 1) : 0; i; i--)

标签: javascript arrays search


【解决方案1】:

我想没有这样的 JS 功能可用。但你可以创建一个

function arrEquals( one, two )
{
    if( one.length != two.length )
    {
        return false;
    }
    for( i = 0; i < one.length; i++ )
    {
        if( one[i] != two[i] )
        {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 但是 OP 想要搜索一个数组,而不是测试两个数组是否相等。
  • 他想在一个数组中搜索一个数组。所以他可以对任何Array的集合使用这个方法。
  • 我是说使用示例会有所帮助。
【解决方案2】:

你可以创建一个哈希。

var ar = [
    [2,6,89,45],
    [3,566,23,79],
    [434,677,9,23]
];

var hash = {};
for(var i = 0 ; i < ar.length; i += 1) {
    hash[ar[i]] = i;
}

var val = [434,677,9,23];

if(hash.hasOwnProperty(val)) {
    document.write(hash[val]);
}

【讨论】:

  • 稍微解释一下就好了。数组在用作对象键时会隐式转换为字符串。
  • @stereofrog 我明白你的意思。示例数据不包括嵌套数组或字符串值。我的回答是处理特定任务的快速方法,而不是检查数组相等性的通用方法。
【解决方案3】:

你可以试试这个吗?

var ar = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

var val = [3,566,23,79];


var sval = val.join("");
for(var i in ar)
{
    var sar = ar[i].join("");
    if (sar==sval) 
    {
        alert("found!");
        break;
    }
}

【讨论】:

  • 很好,但您在函数外部使用“return”(不必要地)会引发错误。
  • 哎呀!我的错!我实际上写了一个包装这段代码的函数!修改。尽管 return 与此无关。你可以使用休息;在一个循环中
【解决方案4】:

这个问题是 Javascript 中的对象/数组相等问题。本质上,问题在于两个数组不相等,即使它们具有相同的值。您需要遍历数组并将成员与您的搜索键 (val) 进行比较,但您需要一种准确比较数组的方法。

解决这个问题的最简单方法是使用允许数组/对象比较的库。 underscore.js 有一个非常吸引人的方法来做到这一点:

for (var i = 0; i < ar.length; i++) {
    if (_.isEqual(ar[i], val)) {
        // value is present
    }
}

如果您不想使用其他库(尽管我会敦促您 -- 或者至少从 Underscore 来源借用消息),您可以使用 JSON.stringify...

var valJSON = JSON.stringify(val);
for (var i = 0; i < ar.length; i++) {
    if (valJSON === JSON.stringify(ar[i]) {
        // value is present
    }
}

不过,这几乎肯定会明显变慢。

【讨论】:

    【解决方案5】:
    function indexOfArray(val, array) {
      var hash = {};
      for (var i = 0; i < array.length; i++) {
        hash[array[i]] = i;
      }
      return (hash.hasOwnProperty(val)) ? hash[val] : -1;
    };
    

    我认为这比containsArray() 更有用。它解决了同样的问题(使用hash table)但返回索引(而不仅仅是布尔值true/false)。

    【讨论】:

      【解决方案6】:

      您还可以使用 JSON 序列化的技巧。它简短而简单,但有点老套。
      它有效,因为 "[0,1]" === "[0,1]"

      这里是工作演示 sn-p:

      Array.prototype.indexOfForArrays = function(search)
      {
        var searchJson = JSON.stringify(search); // "[3,566,23,79]"
        var arrJson = this.map(JSON.stringify); // ["[2,6,89,45]", "[3,566,23,79]", "[434,677,9,23]"]
      
        return arrJson.indexOf(searchJson);
      };
      
      var arr = [
         [2,6,89,45],
         [3,566,23,79],
         [434,677,9,23]
      ];
      
      document.body.innerText = arr.indexOfForArrays([3,566,23,79]);

      【讨论】:

        【解决方案7】:

        为什么不使用 javascript 数组函数?

        function filterArrayByValues(array, values) {
                    return array.filter(function (arrayItem) {
                        return values.some(function (value) {
                            return value === arrayItem;
                        });
                    });
                }
        

        或者如果您的数组更复杂,并且您只想比较一个属性但结果返回整个对象:

          function filterArrayByValues(array, values, propertyName) {
                    return array.filter(function (arrayItem) {
                        return values.some(function (value) {
                            return value === arrayItem[propertyName];
                        });
                    });
                }
        

        更多关于使用的函数:filter()some()

        【讨论】:

          【解决方案8】:

          您可以使用Array.prototype.some()Array.prototype.every() 来检查每个数组的每个元素。

          var ar = [
            [2, 6, 89, 45],
            [3, 566, 23, 79],
            [434, 677, 9, 23]
          ];
          
          var val = [3, 566, 23, 79];
          
          var bool = ar.some(function(arr) {
            return arr.every(function(prop, index) {
              return val[index] === prop
            })
          });
          
          console.log(bool);

          【讨论】:

            【解决方案9】:

            你可以使用 toString 转换来比较元素

            var ar = [
               [2,6,89,45],
               [3,566,23,79],
               [434,677,9,23]
            ];
            
            var val = [3,566,23,79];
            
            s = !ar.every(a => (a.toString() != val.toString()));
            console.log(s) // true
            

            【讨论】:

              【解决方案10】:

              改用这个

              if (ar.join(".").indexOf(val) > -1) {
               return true;
              } else {
               return false;
              }
              

              【讨论】:

                猜你喜欢
                • 2015-07-02
                • 2017-03-26
                • 1970-01-01
                • 1970-01-01
                • 2016-11-08
                • 2012-12-19
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多