2012-01-10 14 views
23

Ho un array che assomiglia a questo:Cerca array multi-dimensionale 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 "] 
... 

come posso cercare un elemento in questo array in base alla prima voce in ciascuna voce (R1, R2, ..) la matrice è enorme sto cercando un digiuno un modo efficace per ottenere risultati da questo array ho usato la funzione di JQuery jQuery.inArray ma non riuscivo a trovare qualche cosa nel mio array, ho usato in questo modo:

alert($.inArray(["r1","7up",61,"Albertsons"],selected_products))// it returns -1 
alert($.inArray("r1",selected_products))//this also returns -1 
+1

Non si vuole restituire l'articolo che stai cercando, basta stabilire se c'è o no? – Briz

+0

@Briz Voglio ottenere l'indice dell'elemento dell'array whre ha "r1" per esempio –

+0

@AymanJitan Ho aggiornato la mia domanda, ora può restituire un elenco di tutti gli indici nel caso in cui non v'è più di un – ajax333221

risposta

39

Se si desidera che sia veloce, si desidera un ciclo for in modo da poter interrompere il ciclo quando viene trovata la corrispondenza.

var result; 
for(var i = 0, len = selected_products.length; i < len; i++) { 
    if(selected_products[i][0] === 'r1') { 
     result = selected_products[i]; 
     break; 
    } 
} 

Ovviamente questo presuppone che ci sia una sola corrispondenza.


Se c'è più di uno, allora si potrebbe utilizzare $.grep se si vuole jQuery:

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

Questo vi darà un nuovo array che è un sottoinsieme degli elementi corrispondenti.


In modo simile, è possibile utilizzare Array.prototype.filter, se supporti solo moderni ambienti JavaScript.

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

Un'altra soluzione sarebbe quella di creare un oggetto in cui le chiavi sono i rn elementi. Questo dovrebbe darti una tabella di ricerca molto veloce.

var r_table = {}; 
for(var i = 0, len = selected_products.length; i < len; i++) { 
    r_table[selected_products[i][0]] = selected_products[i]; 
} 

Poi fare il vostro ricerche in questo modo:

r_table.r4; 

Ancora una volta questo presuppone che non vi siano duplicati rn articoli.

+0

@AymanJitan : Beh, un ciclo di rottura 'for' sarà molto più veloce di quello che avevi. Ma ho appena aggiunto un'altra soluzione in basso che crea un oggetto in modo da poter semplicemente cercare ogni elemento con la chiave 'rn'. Suppongo che tu non abbia duplicati nella lista. –

+0

Se si desidera solo l'indice, nell'ultima soluzione modificare 'r_table [selected_products [i] [0]] = selected_products [i];' a 'r_table [selected_products [i] [0]] = i;' –

+0

@ AymanJitan Ho notato il tuo commento che dice che vuoi ottenere l'indice, devi restituire il 'i' per questo – ajax333221

0

È possibile creare l'oggetto indice {r1: 1, r2: 2 ,. .., < chiave di ricerca>: < indice elemento>, ...} e usarlo per la ricerca.

3

Quindi si sta cercando di trovare l'indice del risultato abbinato ?, bene che cambia le cose un po ':

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" 
} 

Nota: Ciò restituirà il primo risultato abbinato, se si desidera ottenere un array contenente un elenco di tutti gli indici:

var results=[]; 

for(var i = 0, len = selected_products.length; i < len; i++){ 
    if(selected_products[i][0] === "r1"){ 
     results.push(i); 
    } 
} 

È quindi possibile chiamare il numero (ad esempio) l'ultimo 'r1' abbinato come questo selected_products[results[results.length-1]].join(",");

+0

Ho dimenticato di mettere' if (results.length> 0) 'sul mio ultimo esempio. Ma lo lascerò in questo modo, poiché è solo un esempio di come chiamarlo – ajax333221

0

Prova questo,

// 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

Si potrebbe desiderare di prendere in considerazione non fare queste cose in Javascript, ma in un linguaggio lato server di (PHP/Java/.NET).In questo modo si:

  • non avrà problemi con inabilità del browser IE (per lo più errori)
  • Shorter codice Javascript e quindi più veloce da caricare.
  • Il tuo sito funziona anche con Javascript disattivato.

Un esempio come fare questo in 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

solo per prendere @am Io non sono di grande ingresso. Ecco un esempio dal vivo. Lo ha risolto. Volevo solo dare un esempio che funzioni. Spero che sia d'aiuto. Questo mette i valori trovati dal valore selezionato in 2 campi di input.

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

});