我有一个看起来像这样的数组:
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
答案 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(",");
答案 2 :(得分:2)
你可能想考虑不在Javascript中做这些事情,而是用服务器端语言(PHP / Java / .NET)。通过这种方式你:
如何在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;,...}并将其用于搜索。