【问题标题】:Search multi-dimensional array JavaScript搜索多维数组 JavaScript
【发布时间】:2012-01-10 19:35:41
【问题描述】:

我有一个如下所示的数组:

selected_products[0]=["r1","7up",61,"Albertsons"]
selected_products[1]=["r3", "Arrowhead",78,"Arrowhead "]
selected_products[2]=["r8", "Betty Crocker Cake Mix (Variety)",109,"Arrowhead "]
...

如何根据每个项目中的第一个条目(r1,r2,..)在此数组中搜索一个项目 数组很大我正在寻找一种快速有效的方法来从这个数组中获取结果 我使用了 JQuery 函数 jQuery.inArray 但它在我的数组中找不到任何东西,我是这样使用的:

alert($.inArray(["r1","7up",61,"Albertsons"],selected_products))// it returns -1
alert($.inArray("r1",selected_products))//this also returns -1

【问题讨论】:

  • 您不想退回您正在搜索的项目,只需确定它是否存在?
  • @Briz 我想获取数组中项目的索引,例如它有“r1”
  • @AymanJitan 我更新了我的问题,现在它可以返回所有索引的列表,以防有多个索引

标签: javascript jquery


【解决方案1】:

如果您希望它更快,您将需要一个for 循环,以便在找到匹配项时中断循环。

var result;
for( var i = 0, len = selected_products.length; i < len; i++ ) {
    if( selected_products[i][0] === 'r1' ) {
        result = selected_products[i];
        break;
    }
}

当然这是假设只有一场比赛。


如果有多个,那么如果你想要 jQuery,你可以使用$.grep

var result = $.grep(selected_products, function(v,i) {
    return v[0] === 'r1';
});

这将为您提供一个新数组,它是匹配项的子集。


以类似的方式,如果您只支持现代 JavaScript 环境,您可以使用 Array.prototype.filter

var result = selected_products.filter(function(v,i) {
    return v[0] === 'r1';
});

另一种解决方案是创建一个对象,其中键是rn 项。这应该会为您提供一个非常快速的查找表。

var r_table = {};
for( var i = 0, len = selected_products.length; i < len; i++ ) {
    r_table[selected_products[i][0]] = selected_products[i];
}

然后像这样进行查找:

r_table.r4;

再次假设没有重复的rn 项目。

【讨论】:

  • @AymanJitan:嗯,打破for 循环将比你拥有的要快得多。但我只是在底部添加了另一个创建对象的解决方案,因此您可以通过rn 键简单地查找每个项目。我假设您的列表中没有重复项。
  • 如果你只想要索引,那么在最后一个解决方案中将r_table[selected_products[i][0]] = selected_products[i];更改为r_table[selected_products[i][0]] = i;
  • @AymanJitan 我注意到您的评论说您想要获取索引,您需要为此返回i
  • @ajax333221 是的,我知道,我从这个例子中得到它,谢谢你的笔记
【解决方案2】:

所以你试图找到匹配结果的索引?,这改变了一些事情:

var index=-1;

for(var i = 0, len = selected_products.length; i < len; i++){
    if(selected_products[i][0] === "r1"){
        index = i;
        break;
    }
}
if(index > -1){
    alert(selected_products[index].join(","));//"r1,7up,61,Albertsons"
}

注意:如果你想得到一个包含所有索引列表的数组,这将返回第一个匹配的结果:

var results=[];

for(var i = 0, len = selected_products.length; i < len; i++){
    if(selected_products[i][0] === "r1"){
        results.push(i);
    }
}

然后您可以像这样调用(例如)最后一个匹配的“r1”selected_products[results[results.length-1]].join(",");

【讨论】:

  • 我忘了把if(results.length &gt; 0)放在我的最后一个例子上。但我会这样说,因为它只是一个如何调用它的示例
【解决方案3】:

只是为了接听@am 不是我的好意见。这是一个活生生的例子。他解决了。我只是想举一个它有效的例子。希望能帮助到你。这会将从选定值中找到的值放在 2 个输入字段中。

http://jsfiddle.net/asle/ZZ78j/2/

$(document).ready(function () {
var liste = [];
liste[0] = ["First Name", "12345678", "first.name@testdomain.no"];
liste[1] = ["Second Name", "20505050", "second.nametestdomain.no"];
liste[2] = ["", "", ""];
$("#selger").change(function () {
    var valg = ($(this).val());
    var telefon;
    var epost;
    for (var i = 0, len = liste.length; i < len; i++) {
        if (liste[i][0] === valg) {
            telefon = liste[i][1];
            epost = liste[i][2];
            $("#tel").val(telefon);
            $("#epost").val(epost);
            break;
        }
    }
});

});

【讨论】:

    【解决方案4】:

    试试这个,

    // returns the index of inner array, if val matches in any array
    function findIn2dArray(arr_2d, val){
        var indexArr = $.map(arr_2d, function(arr, i) {
                if($.inArray(val, arr) != -1) {
                    return 1;
                }
    
                return -1;
        });
    
        return indexArr.indexOf(1);
    }
    
    
    function test(){
        alert(findIn2dArray(selected_products, 'r8'));
    }
    

    【讨论】:

      【解决方案5】:

      您可能想考虑不使用 Javascript 而是使用服务器端语言 (PHP/Java/.NET) 来执行这些操作。这样你:

      • 不会有浏览器无法使用的问题(主要是 IE 错误)
      • Javascript 代码更短,因此加载速度更快。
      • 您的网站也可以在关闭 Javascript 的情况下运行。

      如何在 PHP 中执行此操作的示例:

      <?php 
      function search($array, $key, $value) 
      { 
          $results = array(); 
      
          if (is_array($array)) 
          { 
              if (isset($array[$key]) && $array[$key] == $value) 
                  $results[] = $array; 
      
              foreach ($array as $subarray) 
                  $results = array_merge($results, search($subarray, $key, $value)); 
          } 
      
          return $results; 
      } 
      ?>
      

      【讨论】:

        【解决方案6】:

        您可以创建索引对象 { r1: 1, r2: 2,..., : , ...} 并使用它进行搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 2011-07-05
          • 2011-11-29
          • 2011-06-26
          • 2014-06-27
          • 1970-01-01
          相关资源
          最近更新 更多