Existe uma maneira no JavaScript comparar valores de uma matriz e ver se está em outra matriz?
Semelhante à in_array
função do PHP ?
Existe uma maneira no JavaScript comparar valores de uma matriz e ver se está em outra matriz?
Semelhante à in_array
função do PHP ?
Respostas:
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.
indexOf
w3schools.com/jsref/jsref_indexof_array.asp
Existe agora Array.prototype.includes
:
O método includes () determina se uma matriz inclui um determinado elemento, retornando verdadeiro ou falso, conforme apropriado.
var a = [1, 2, 3];
a.includes(2); // true
a.includes(4); // false
Sintaxe
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
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:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
Existem até alguns trechos de uso úteis para o seu prazer em scripts.
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 converte this.length
em um número que pode ser representado como um número inteiro não assinado de 32 bits. Um nativo Array
pode ter apenas um comprimento que já esteja em conformidade com isso, mas a especificação afirma que você pode chamar Array.prototype
métodos em objetos JS nativos que não o são Array
. 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:
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
E, como bônus, aqui está o equivalente ao array_search do PHP (para encontrar a chave do elemento no array:
function array_search(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return i;
}
return false;
}
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:
in_array('van', myArray);
in_array(1, otherArray, true); // Forcing strict type
Você pode simplesmente usar a função "includes", conforme explicado nesta lição no w3schools
parece
let myArray = ['Kevin', 'Bob', 'Stuart'];
if( myArray.includes('Kevin'))
console.log('Kevin is here');
var a = [1,2,3,4,5,6,7,8,9];
var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;
var isSixInArray = a.indexOf(6)>=0;
A solução jQuery está disponível, consulte a documentação aqui: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Existe uma função equivalente:
includes()
Veja aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
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):
function arrayIntersect(a, b) {
var intersection = [];
for(var i = 0; i < a.length; i++) {
if(inArray(b, a[i]))
intersection.push(a[i]);
}
return intersection;
}
Isso retornará uma matriz de valores que estão em ambos a
e b
. Matematicamente, essa é uma interseção das duas matrizes.
EDIT: Veja o Código Editado de Paolo para a solução do seu problema. :)
Se você precisar de todos os parâmetros disponíveis do PHP , use este:
function in_array(needle, haystack, argStrict) {
var key = '', strict = !!argStrict;
if (strict) {
for (key in haystack) {
if (haystack[key] === needle) {
return true;
}
}
}
else {
for (key in haystack) {
if (haystack[key] == needle) {
return true;
}
}
}
return false;
}
Adicione esse código ao seu projeto e use os métodos inArray no estilo de objeto
if (!Array.prototype.inArray) {
Array.prototype.inArray = function(element) {
return this.indexOf(element) > -1;
};
}
//How it work
var array = ["one", "two", "three"];
//Return true
array.inArray("one");
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.
haystack.find(value => value == needle)
onde palheiro é uma matriz e agulha é um elemento na matriz. Se o elemento não encontrado for retornado indefinido, o mesmo elemento.
Se você for usá-lo em uma classe e se preferir que seja funcional (e funcione em todos os navegadores):
inArray: function(needle, haystack)
{
var result = false;
for (var i in haystack) {
if (haystack[i] === needle) {
result = true;
break;
}
}
return result;
}
Espero que ajude alguém :-)
jQuery.inArray()
se não retornar boolean. Ele retorna o índice do elemento encontrado ou -1, se não encontrado