Подтвердить что ты не робот

Поиск многомерного массива 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
4b9b3361

Ответ 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'));
}