2012-08-09 14 views
6

Im avendo un array javascript multidimensionale come questo.Indice Javascript per valori multipli

[ 
["9", "16", "19", "24", "29", "38"], 
["9", "15", "19", "24", "29", "38"], 
["10", "16", "19", "24", "29", "38"], 
["9", "16", "17", "19", "24", "29", "39"], 
["10", "16", "17", "19", "24", "29", "39"], 
["9", "15", "21", "24", "29", "38"] 

....... 
....... 
] 

Circa il 40 per l'esattezza

e im avendo una chiamata verifica un altro array con i seguenti valori

[9,10] //This is of size two for example,it may contain any number of elements BUT it only contains elements(digits) from the multidimensional array above 

quello che voglio è ho bisogno di fare l'array multidimensionale unico based per la controllare gli elementi dell'array

1. Esempio se l'array di controllo è [15] Quindi l'array multidimensionale sarebbe

[ 
    ["9", "15", "19", "24", "29", "38"], 
    //All the results which contain 15 

] 

2.Example se gamma di controllo è [15,21] Poi array multidimensionale sarebbe

[ 
    ["9", "15", "21", "24", "29", "38"] 
    //simply containing 15 AND 21.Please note previous example has only 15 in it not 21 
    //I need an AND not an OR 

] 

avevo provato il metodo JavaScript IndexOf ma mi sta ottenendo un risultato tramite OR NOT e

Grazie in anticipo

+3

_ "Circa 40 per la precisione" _ - Ah, ironia. – nnnnnn

+0

@nnnnnn ... spero di aver capito l'idea. Se non mi spiego meglio – coolguy

+1

Sì, vuoi filtrare l'array originale per restituire tutti gli array figlio che contengono tutti gli elementi dell'array di controllo. Tranne che il tuo secondo esempio restituisce un array figlio non mostrato nel tuo originale, quindi forse non capisco. (Il mio commento precedente stava solo prendendo in giro la tua scelta di parole lì.) – nnnnnn

risposta

5

È possibile utilizzare il .filter() method:

var mainArray = [ /* your array here */ ], 
    check = ["15", "21"], 
    result; 

result = mainArray.filter(function(val) { 
    for (var i = 0; i < check.length; i++) 
     if (val.indexOf(check[i]) === -1) 
      return false;  
    return true; 
}); 

console.log(result); 

Demo: http://jsfiddle.net/nnnnnn/Dq6YR/

Nota che .filter() non è supportato da IE fino alla versione 9, ma you can fix that.

+0

Grazie amico!lo verificherò e ti farò sapere – coolguy

+0

+1 ed grazie per il tuo impegno – coolguy

2

C'è anche una soluzione che non utilizza filter() o every():

// function 

function AndArray(start, check) { 

    this.stripArray = function(element, array) { 
     var _array = []; 
     for(var i = 0; i < array.length; i++) 
      for(var j = 0; j < array[i].length; j++) 
       if(element == array[i][j]) _array.push(array[i]); 
     return _array; 
     } 

    for(var k = 0; k < start.length; k++) 
     if(start.length > 0) start = this.stripArray(check[k], start); 

    return start; 

    } 

// use 

var check = [15, 21]; 

var start= [[ 15, 6 , 8], [3, 21, 56], [15, 3, 21]]; 

console.log(AndArray(start, check));  
+0

Grazie amico! lo verificherò e ti farò sapere – coolguy

+0

+1 ed grazie per il tuo impegno – coolguy

3

Uso .filter e .every, è possibile filtrare le righe per cui ogni argomento è evidente nella riga:

var filter = function(args) { 
    return arr.filter(function(row) { 
    return args.every(function(arg) { 
     return ~row.indexOf(String(arg)); // [15] should search for ["15"] 
    }); 
    }); 
}; 

.every fa efficacemente un'operazione AND qui; per OR invece è possibile utilizzare .some. Quelle funzioni di matrice sono disponibili sui nuovi browser.

+0

Grazie amico! controllerà e ti farà sapere – coolguy

+0

+1 ed grazie per il tuo impegno – coolguy