搜索多维数组JavaScript

时间:2012-01-10 19:35:41

标签: javascript jquery

我有一个看起来像这样的数组:

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

6 个答案:

答案 0 :(得分:50)

如果你希望它快,你需要一个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';
});

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


以类似的方式,如果您只支持现代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项。

答案 1 :(得分:3)

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

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

然后,您可以调用(例如)与此selected_products[results[results.length-1]].join(",");

匹配的最后一个'r1'

答案 2 :(得分:2)

你可能想考虑不在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; 
} 
?>

答案 3 :(得分:2)

只是为了接受@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 :(得分:1)

试试这个,

// 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 :(得分:0)

您可以创建索引对象{r1:1,r2:2,...,&lt;搜索键&gt;:&lt;元素索引&gt;,...}并将其用于搜索。