array di ricerca javascript di array

Diciamo che abbiamo il seguente array js

var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var val = [3,566,23,79]; 

Esiste una funzione built-in js o una jQuery con cui è ansible cercare l’array ar per val ?

Grazie

** * AGGIORNAMENTO * ** * ** * ** * ** *

Prendendo la risposta della fusione ho creato questo prototipo

 Array.prototype.containsArray = function(val) { var hash = {}; for(var i=0; i<this.length; i++) { hash[this[i]] = i; } return hash.hasOwnProperty(val); } 

potresti creare un hash.

 var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var hash = {}; for(var i = 0 ; i < ar.length; i += 1) { hash[ar[i]] = i; } var val = [434,677,9,23]; if(hash.hasOwnProperty(val)) { document.write(hash[val]); } 
 function indexOfArray(val, array) { var hash = {}, indexes = {}, i, j; for(i = 0; i < array.length; i++) { hash[array[i]] = i; } return (hash.hasOwnProperty(val)) ? hash[val] : -1; }; 

Considero questo più utile per than containsArray() . Risolve lo stesso problema ma restituisce l'indice anziché solo un valore booleano di true o false .

Puoi anche usare un trucco con serializzazione JSON. È breve e semplice, ma un po ‘hacky.
Funziona, perché "[0,1]" === "[0,1]" .

Ecco lo snippet dimostrativo di lavoro:

 Array.prototype.indexOfForArrays = function(search) { var searchJson = JSON.stringify(search); // "[3,566,23,79]" var arrJson = this.map(JSON.stringify); // ["[2,6,89,45]", "[3,566,23,79]", "[434,677,9,23]"] return arrJson.indexOf(searchJson); }; var arr = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; document.body.innerText = arr.indexOfForArrays([3,566,23,79]); 

Puoi provare questo?

 var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var val = [3,566,23,79]; var sval = val.join(""); for(var i in ar) { var sar = ar[i].join(""); if (sar==sval) { alert("found!"); break; } } 

Immagino che non ci siano tali funzionalità JS disponibili. ma puoi crearne uno

 function arrEquals( one, two ) { if( one.length != two.length ) { return false; } for( i = 0; i < one.length; i++ ) { if( one[i] != two[i] ) { return false; } } return true; } 

Il problema con questo è quello di uguaglianza object / array in Javascript. In sostanza, il problema è che due array non sono uguali, anche se hanno gli stessi valori. È necessario scorrere l’array e confrontare i membri con la chiave di ricerca ( val ), ma è necessario un modo per confrontare accuratamente gli array.

Il modo più semplice è utilizzare una libreria che consenta il confronto di array / object. underscore.js ha un metodo molto attraente per fare questo:

 for (var i = 0; i < ar.length; i++) { if (_.isEqual(ar[i], val)) { // value is present } } 

Se non vuoi usare un'altra libreria (anche se ti esorterei a - o almeno a prendere in prestito il messaggio dall'origine Underscore), potresti farlo con JSON.stringify ...

 var valJSON = JSON.stringify(val); for (var i = 0; i < ar.length; i++) { if (valJSON === JSON.stringify(ar[i]) { // value is present } } 

Questo sarà quasi certamente molto più lento, comunque.

Perché non usi le funzioni di javascript array?

 function filterArrayByValues(array, values) { return array.filter(function (arrayItem) { return values.some(function (value) { return value === arrayItem; }); }); } 

O se l’array è più complicato e vuoi confrontare solo una proprietà ma come risultato restituisci l’intero object:

  function filterArrayByValues(array, values, propertyName) { return array.filter(function (arrayItem) { return values.some(function (value) { return value === arrayItem[propertyName]; }); }); } 

Ulteriori informazioni sulle funzioni utilizzate: filter () e some ()

È ansible utilizzare Array.prototype.some() , Array.prototype.every() per controllare ciascun elemento di ogni matrice.

 var ar = [ [2, 6, 89, 45], [3, 566, 23, 79], [434, 677, 9, 23] ]; var val = [3, 566, 23, 79]; var bool = ar.some(function(arr) { return arr.every(function(prop, index) { return val[index] === prop }) }); console.log(bool);