繁体   English   中英

搜索多维数组JavaScript

[英]Search multi-dimensional array JavaScript

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

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

如果你想要它很快,你需要一个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项目。

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

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(",");

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

只是为了接受@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;
        }
    }
});

});

试试这个,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM