搜索多维数组JavaScript

Eva*_*que 28 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 "]
...
Run Code Online (Sandbox Code Playgroud)

如何根据每个项目中的第一个条目(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
Run Code Online (Sandbox Code Playgroud)

小智 52

如果你想要它快,你需要一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然这假设只有一场比赛.


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

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

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


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

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

另一种解决方案是创建一个对象,其中键是rn项目.这应该给你一个非常快速的查找表.

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

那么你的查找是这样的:

r_table.r4;
Run Code Online (Sandbox Code Playgroud)

同样,这假设没有重复的rn项目.