Поиск многомерного массива 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
Ответы
Ответ 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;
}
}
Конечно, это предполагает только одно совпадение.
Если есть более одного, то вы можете использовать $.grep
, если хотите jQuery:
var result = $.grep(selected_products, function(v,i) {
return v[0] === 'r1';
});
Это даст вам новый массив, который является подмножеством согласованных элементов.
Аналогичным образом вы можете использовать Array.prototype.filter
, если вы только поддерживаете современные среды JavaScript.
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
.
Ответ 2
Итак, вы пытаетесь найти индекс совпадающего результата?, ну, что немного меняет вещи:
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(",");
Ответ 3
Возможно, вы захотите не делать этого в 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;
}
?>
Ответ 4
Просто чтобы поднять @am, я не большой вход. Вот живой пример. Он решил это. Я просто хотел привести пример, в котором он работает. Надеюсь, поможет. Это ставит значения из выбранного значения в 2 поля ввода.
http://jsfiddle.net/asle/ZZ78j/2/
$(document).ready(function () {
var liste = [];
liste[0] = ["First Name", "12345678", "[email protected]"];
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;
}
}
});
});
Ответ 5
Вы можете создать индексный объект {r1:1, r2: 2,..., < ключ поискa > : < element index > ,...} и использовать его для поиска.
Ответ 6
Попробуйте это,
// 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'));
}