2012-01-10 105 views
23

我有一個數組,看起來像這樣:搜索多維數組的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

你不想回你要搜索的內容,只需確定它的存在與否? – Briz 2012-01-10 19:38:53

+0

@Briz我想獲得該數組中的項目索引,例如它具有「r1」例如 – 2012-01-10 19:46:25

+0

@AymanJitan我更新了我的問題,現在它可以返回所有索引的列表,以防萬一有多個 – ajax333221 2012-01-10 20:25:44

回答

39

如果您希望速度更快,您需要一個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; 
    } 
} 

當然這個假設只有一個匹配。

var result = $.grep(selected_products, function(v,i) { 
    return v[0] === 'r1'; 
}); 

這會給你一個新的數組,它是匹配項的子集:


如果有不止一個,那麼你可以,如果你想使用jQuery的$.grep


以類似的方式,你可以使用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項目。

+0

@AymanJitan :那麼,一個突破'for'循環會比你現有的要快得多。但我只是在底部添加了另一個創建對象的解決方案,因此您可以通過'rn'鍵簡單查找每個項目。我假設你在列表中沒有重複。 – 2012-01-10 19:49:28

+0

如果您只想索引,那麼在最後的解決方案中,將'r_table [selected_products [i] [0]] = selected_products [i];'更改爲'r_table [selected_products [i] [0]] = i;' – 2012-01-10 19:52:34

+0

@ AymanJitan我注意到你的評論說你想獲得索引,你需要返回'i'這個 – ajax333221 2012-01-10 20:06:53

0

您可以創建索引對象{r1:1,r2:2 ,. ...,<搜索鍵>:<元素索引>,...}並將其用於搜索。

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

然後,您可以撥打電話(例如)最後「R1」匹配這樣selected_products[results[results.length-1]].join(",");

+0

我忘了把'如果(results.length> 0)'在我的最後一個例子。但我會這樣離開它,因爲它只是一個如何調用它的例子 – ajax333221 2012-01-10 20:29:20

0

試試這個,

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

你可能想考慮不這樣做在Javascript支持,但是在服務器片面的語言(PHP/Java的/ .NET)這些事情。這樣你:

  • 不會有瀏覽器incapabilities(大部分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; 
} 
?> 
2

只需拿起@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; 
     } 
    } 
}); 

});