搜索多维数组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;
同样,这假设没有重复的项目。
所以你试图找到匹配结果的索引?,这会改变一些事情:
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中执行此操作的示例:
只是为了接受@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; } } }); });
您可以创建索引对象{r1:1,r2:2,…,<搜索键>:<元素索引>,…}并将其用于搜索。
试试这个,
// 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')); }