Eu tenho uma matriz como
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Como verifico esta matriz para ver se existe Magenic? Não quero fazer um loop, a menos que precise. Estou trabalhando com potencialmente alguns milhares de discos.
ATUALIZADA
Como esse post foi popular, pensei em compartilhar algo novo que encontrei. E parece que o @CAFxX já compartilhou isso! Eu deveria ler isso com mais frequência. Me deparei com https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
E com o ECMAScript 2015 , é ainda mais simples usar as novas funções de seta:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
fonte
fonte
Respostas:
Edição de 2018 : esta resposta é de 2011, antes que os navegadores tivessem amplo suporte a métodos de filtragem de matriz e funções de seta. Ter um olhar para a resposta de CAFxX .
Não existe uma maneira "mágica" de verificar algo em uma matriz sem um loop. Mesmo se você usar alguma função, a própria função usará um loop. O que você pode fazer é sair do circuito assim que encontrar o que procura para minimizar o tempo computacional.
fonte
'Magenic'
está em outro lugar no objetoNão há necessidade de reinventar o
rodaloop, pelo menos não explicitamente (usando funções de seta , apenas navegadores modernos ):ou, melhor ainda :
EDIT: Se você precisa de compatibilidade com navegadores ruins, sua melhor aposta é:
fonte
some
pode causar um curto-circuito quando um objetoname === "Magenic"
é encontrado. Comfilter
, ele irá verificar cada item até o final da matriz e criar um novo itens de matriz que correspondem a condição, então verificar olength
Nenhum loop é necessário. Três métodos que vêm à mente:
Array.prototype.some ()
Esta é a resposta mais exata para sua pergunta, ou seja, "verifique se existe alguma coisa", implicando um resultado booleano. Isso será verdadeiro se houver algum objeto 'Magenic', caso contrário, false:
Array.prototype.filter ()
Isso retornará uma matriz de todos os objetos 'Magenic', mesmo se houver apenas uma (retornará uma matriz de um elemento):
Se você tentar coagir isso a um booleano, ele não funcionará, pois uma matriz vazia (sem objetos 'Magenic') ainda é verdadeira. Então, basta usar
magenicVendors.length
em seu condicional.Array.prototype.find ()
Isso retornará o primeiro objeto 'Magenic' (ou,
undefined
se não houver):Isso obriga a um valor booleano (qualquer objeto é verdadeiro,
undefined
é falso).Nota: Estou usando o fornecedor ["Nome"] em vez de vendor.Name devido ao invólucro estranho dos nomes das propriedades.
Nota 2: Não há razão para usar igualdade solta (==) em vez de igualdade estrita (===) ao verificar o nome.
fonte
A resposta aceita ainda funciona, mas agora temos um método nativo ECMAScript 6
[Array.find][1]
para obter o mesmo efeito.Citando MDN:
Veja meu link do jsfiddle Há um polyfill para IE fornecido pelo mozilla
fonte
return ele.id == '2'
, mas +1 para uma boa solução ES6.push if <0 || splice(index, 1)
aqui está o meu código um pouco atualizado: #const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Aqui está o jeito que eu faria
array.some()
O método verifica se há pelo menos um valor em uma matriz que corresponde aos critérios e retorna um booleano. A partir daqui, você pode ir com:fonte
A menos que você queira reestruturá-lo assim:
para o qual você pode fazer
if(vendors.Magnetic)
Você terá que fazer um loop
fonte
De acordo com a especificação ECMAScript 6, você pode usar
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
reterá0
(que é o índice na matriz) ou-1
se não foi encontrado.fonte
Como o OP fez a pergunta se a chave existe ou não .
Uma solução mais elegante que retornará booleano usando a função de redução ES6 pode ser
Nota: O parâmetro inicial de reduzir é ae,
false
se a matriz tiver a chave, ela retornará verdadeiro.Espero que ajude a uma implementação melhor e mais limpa do código
fonte
reduce
é o acumulador e não ovendor
objeto. Isso verificafalse.Name === "Magenic"
todos os circuitos e retorna falsoVocê não pode sem olhar realmente para o objeto.
Você provavelmente deve mudar um pouco sua estrutura, como
Então você pode usá-lo como um hash de pesquisa.
fonte
Pode ser tarde demais, mas a matriz javascript possui dois métodos
some
e oevery
método que retorna um booleano e pode ajudá-lo a conseguir isso.Eu acho
some
que seria mais apropriado para o que você pretende alcançar.Alguns valida que qualquer um dos objetos na matriz satisfaça a condição especificada.
Every valida que todos os objetos na matriz satisfazem a condição especificada.
fonte
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
, deve retornar verdadeirosome
, irá atualizar minha resposta.Você tem que fazer um loop, não há como contornar isso.
Claro que você pode usar uma biblioteca como linq.js para tornar isso mais agradável:
(veja jsFiddle para uma demonstração)
Duvido que o linq.js seja mais rápido que um loop direto, mas certamente é mais flexível quando as coisas ficam um pouco mais complicadas.
fonte
Testando elementos de matriz:
JS Oferece funções de matriz que permitem que você consiga isso com relativa facilidade. Eles são os seguintes:
Array.prototype.filter
: Executa uma função de retorno de chamada que é um teste; a matriz é iterada com o retorno de chamada e filtrada de acordo com esse retorno de chamada. Uma nova matriz filtrada é retornada.Array.prototype.some
: Executa uma função de retorno de chamada que é um teste, a matriz é iterada com o retorno de chamada e, se algum elemento passa no teste, o valor booleano verdadeiro é retornado. Caso contrário, false será retornadoAs especificidades são melhor explicadas através de um exemplo:
Exemplo:
Suporte do navegador:
Essas duas funções são
ES6
funcionais, nem todos os navegadores podem suportá-los. Para superar isso, você pode usar um polyfill. Aqui está o polyfill paraArray.prototype.some
(do MDN):fonte
se você estiver usando jquery, poderá aproveitar o grep para criar um array com todos os objetos correspondentes:
e use a matriz de resultados:
fonte
Corrija-me se estiver errado .. eu poderia ter usado um
forEach
método como este,Hoje em dia estou acostumado, por causa da simplicidade e da palavra autoexplicativa. Obrigado.
fonte
Você pode tentar este trabalho para mim.
fonte
Você pode usar lodash . Se a biblioteca lodash for muito pesada para o seu aplicativo, considere separar funções desnecessárias não usadas.
Esta é apenas uma maneira de fazer isso. Outro pode ser:
console.log(arr);
O exemplo acima também pode ser reescrito sem o uso de bibliotecas como:
Espero que minha resposta ajude.
fonte
Muitas respostas aqui são boas e muito fáceis. Mas se sua matriz de objetos estiver com um conjunto fixo de valores, você poderá usar o truque abaixo:
Mapeie todo o nome em um objeto.
Agora esse dirtyObj você pode usar repetidamente sem nenhum loop.
fonte
Para comparar um objeto com outro, eu combino um loop for in (usado para percorrer objetos) e some (). Você não precisa se preocupar com uma matriz fora dos limites, etc, para que economize algum código. A documentação sobre .some pode ser encontrada aqui
Uma maneira alternativa de comparar um objeto a outro é usar um loop for aninhado com Object.keys (). Length para obter a quantidade de objetos na matriz. Código abaixo:
Para responder sua pergunta exata, se você estiver apenas procurando por um valor em um objeto, use um loop for in único.
fonte
Como alternativa, você pode fazer:
fonte
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Exemplo:without2([{id:1},{id:1},{id:2}],{id:2})
Resultado: sem2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
fonte
fonte
Minha abordagem para resolver esse problema é usar o ES6 e criar uma função que faça a verificação para nós. O benefício dessa função é que pode ser reutilizável em todo o seu projeto para verificar qualquer matriz de objetos, dada a
key
e avalue
verificação.CONVERSA BASTANTE, VAMOS O CÓDIGO
Matriz
Função
Chamada / Uso
fonte
Eu prefiro ir com regex.
Se o seu código for o seguinte,
eu recomendaria
fonte