Existe uma maneira no JavaScript comparar valores de uma matriz e ver se está em outra matriz?
Semelhante à in_array
função do PHP ?
fonte
Existe uma maneira no JavaScript comparar valores de uma matriz e ver se está em outra matriz?
Semelhante à in_array
função do PHP ?
Não, não tem um. Por esse motivo, as bibliotecas mais populares vêm com uma em seus pacotes de utilitários. Confira jQuery inArray e do Prototype Array.indexOf para exemplos.
A implementação do jQuery é tão simples quanto você pode esperar:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Se você estiver lidando com uma quantidade sensata de elementos da matriz, o procedimento acima será bem-sucedido.
EDIT : Opa. Eu nem percebi que você queria ver se uma matriz estava dentro de outra. De acordo com a documentação do PHP, este é o comportamento esperado do PHP in_array
:
$a = array(array('p', 'h'), array('p', 'r'), 'o');
if (in_array(array('p', 'h'), $a)) {
echo "'ph' was found\n";
}
if (in_array(array('f', 'i'), $a)) {
echo "'fi' was found\n";
}
if (in_array('o', $a)) {
echo "'o' was found\n";
}
// Output:
// 'ph' was found
// 'o' was found
O código postado por Chris e Alex não segue esse comportamento. Alex é a versão oficial do indexOf do Prototype e Chris é mais parecido com o PHP array_intersect
. Isso faz o que você deseja:
function arrayCompare(a1, a2) {
if (a1.length != a2.length) return false;
var length = a2.length;
for (var i = 0; i < length; i++) {
if (a1[i] !== a2[i]) return false;
}
return true;
}
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(typeof haystack[i] == 'object') {
if(arrayCompare(haystack[i], needle)) return true;
} else {
if(haystack[i] == needle) return true;
}
}
return false;
}
E este é o meu teste do acima exposto:
var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
alert('ph was found');
}
if(inArray(['f','i'], a)) {
alert('fi was found');
}
if(inArray('o', a)) {
alert('o was found');
}
// Results:
// alerts 'ph' was found
// alerts 'o' was found
Observe que eu intencionalmente não estendi o protótipo Array, pois geralmente é uma má idéia fazê-lo.
jQuery.inArray()
se não retornar boolean. Ele retorna o índice do elemento encontrado ou -1, se não encontradoindexOf
w3schools.com/jsref/jsref_indexof_array.aspExiste agora
Array.prototype.includes
:fonte
Array.indexOf
foi introduzido no JavaScript 1.6, mas não é suportado em navegadores mais antigos. Felizmente, os funcionários da Mozilla fizeram todo o trabalho duro por você e forneceram isso para compatibilidade:Existem até alguns trechos de uso úteis para o seu prazer em scripts.
fonte
this.length >>> 0
? Isso é uma conversão para um tipo de número?Array.indexOf
agora é padronizado pelo ECMAScript Fifth Edition, portanto deve ser considerado a maneira 'nativa' adequada de fazê-lo. Você ainda precisará farejar e fornecer esse backup para um navegador mais antigo por um longo tempo. @harto: sim, ele se convertethis.length
em um número que pode ser representado como um número inteiro não assinado de 32 bits. Um nativoArray
pode ter apenas um comprimento que já esteja em conformidade com isso, mas a especificação afirma que você pode chamarArray.prototype
métodos em objetos JS nativos que não o sãoArray
. Este e o outro argumento pedante de verificação de coisas é garantir a conformidade absoluta das especificações.Se os índices não estiverem em seqüência ou se não forem consecutivos, o código nas outras soluções listadas aqui será interrompido. Uma solução que funcionaria um pouco melhor pode ser:
E, como bônus, aqui está o equivalente ao array_search do PHP (para encontrar a chave do elemento no array:
fonte
Existe um projeto chamado Locutus , que implementa funções PHP em Javascript e in_array () está incluído, você pode usá-lo exatamente como em PHP.
Exemplos de uso:
fonte
Você pode simplesmente usar a função "includes", conforme explicado nesta lição no w3schools
parece
fonte
fonte
A solução jQuery está disponível, consulte a documentação aqui: http://api.jquery.com/jquery.inarray/
fonte
Existe uma função equivalente:
Veja aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
fonte
Se você deseja apenas verificar se um único valor está em uma matriz, o código de Paolo fará o trabalho. Se você deseja verificar quais valores são comuns a ambas as matrizes, convém algo assim (usando a função inArray de Paolo):
Isso retornará uma matriz de valores que estão em ambos
a
eb
. Matematicamente, essa é uma interseção das duas matrizes.EDIT: Veja o Código Editado de Paolo para a solução do seu problema. :)
fonte
Se você precisar de todos os parâmetros disponíveis do PHP , use este:
fonte
Adicione esse código ao seu projeto e use os métodos inArray no estilo de objeto
fonte
Com o Dojo Toolkit , você usaria
dojo.indexOf()
. Veja dojo.indexOf para a documentação e Arrays Made Easy por Bryan Forbes para alguns exemplos.fonte
onde palheiro é uma matriz e agulha é um elemento na matriz. Se o elemento não encontrado for retornado indefinido, o mesmo elemento.
fonte
fonte
Encontrei uma ótima solução jQuery aqui no SO.
Eu gostaria que alguém publicasse um exemplo de como fazer isso em sublinhado.
fonte
fonte
indexOf(needle) > 0
retornar falsoUm equivalente de
in_array
comunderscore
é _.indexOfExemplos:
_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found
fonte
Se você for usá-lo em uma classe e se preferir que seja funcional (e funcione em todos os navegadores):
Espero que ajude alguém :-)
fonte