2012-01-10 17 views
23

tengo una matriz que se parece a esto:Buscar matriz multidimensional 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 "] 
... 

cómo puedo buscar un elemento en esta matriz de acuerdo con la primera entrada de cada elemento (r1, r2, ..) la matriz es enorme Busco a un ayuno de una forma eficaz de obtener los resultados de esta matriz utilicé la función jQuery jQuery.inArray pero no pude encontrar ninguna cosa en mi matriz, he usado de esta manera:

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

Usted no quiere devolver el artículo que está buscando, simplemente determinar si está allí o no? – Briz

+0

@Briz quiero obtener el índice del artículo en la matriz donde tiene "r1", por ejemplo –

+0

@AymanJitan Actualicé mi pregunta, ahora puede devolver una lista de todos los índices en caso de que haya más de un – ajax333221

Respuesta

39

Si quiere que sea rápido, querrá un bucle for para poder romper el bucle cuando se encuentre la coincidencia.

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

Por supuesto, esto supone que solo hay una coincidencia.


Si hay más de uno, entonces se podría utilizar $.grep si quieres jQuery:

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

Esto le dará una nueva matriz que es un subconjunto de los elementos coincidentes.


De manera similar, se puede usar Array.prototype.filter, si es compatible con los entornos modernos de JavaScript.

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

Otra solución sería la creación de un objeto donde las claves son los rn artículos. Esto debería darte una tabla de búsqueda muy rápida.

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

Después, realice sus búsquedas de la siguiente manera:

r_table.r4; 

De nuevo, esto supone que no hay duplicados rn artículos.

+0

@AymanJitan : Bueno, un ciclo 'for' será mucho más rápido que lo que tuviste. Pero acabo de agregar otra solución en la parte inferior que crea un objeto para que simplemente pueda buscar cada elemento con la tecla 'rn'. Supongo que no tienes duplicados en la lista. –

+0

Si solo quería el índice, en la última solución cambie 'r_table [productos_seleccionados [i] [0]] = productos_seleccionados [i];' a 'tabla_r [productos_seleccionados [i] [0]] = i;' –

+0

@ AymanJitan noté tu comentario que dice que quieres obtener el índice, necesitas devolver el 'i' para este – ajax333221

0

Puede crear el objeto de índice {r1: 1, r2: 2 ,. .., < clave de búsqueda>: < elemento índice>, ...} y úselo para buscar.

3

Así que usted está tratando de encontrar el índice del resultado igualado ?, bueno eso cambia las cosas un poco:

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: Esto devolverá el primer resultado igualado, si quieres obtener una matriz que contiene una lista de todos los índices:

var results=[]; 

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

continuación, puede llamar al (por ejemplo) el último 'R1' igualada como esta selected_products[results[results.length-1]].join(",");

+0

Me olvidé de poner' if (results.length> 0) 'en mi último ejemplo. Pero lo dejaré de esta manera, ya que fue solo un ejemplo de cómo llamarlo – ajax333221

0

Prueba de esto,

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

Es posible que desee considerar no hacer estas cosas en Javascript, pero en un lenguaje caras servidor (PHP/Java/.NET).De esta manera:

  • no tendrá problemas con incapacidades del navegador (en su mayoría errores IE)
  • Shorter código Javascript y por lo tanto más rápido de cargar.
  • Su sitio también funciona con Javascript desactivado.

Un ejemplo de cómo hacer esto en 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

sólo para recoger @am no soy de gran entrada. Aquí hay un ejemplo en vivo. Él lo resolvió. Solo quería dar un ejemplo de que funciona. Espero eso ayude. Esto pone los valores encontrados del valor seleccionado en 2 campos de entrada.

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

}); 
Cuestiones relacionadas