Eu tenho um objeto JavaScript bastante simples, que eu uso como uma matriz associativa. Existe uma função simples que me permita obter a chave de um valor ou preciso iterar o objeto e descobri-lo manualmente?
javascript
object
arik
fonte
fonte
var o = []; var map = {first: o, second: o}
. O quefind_key(o)
retornaria?Respostas:
Com a biblioteca Underscore.js :
fonte
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, sem mutações de protótipo ou bibliotecas externas.
Exemplo,
fonte
keys()
materializa o conjunto de chaves.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Nenhum método padrão disponível. Você precisa iterar e pode criar um auxiliar simples:
Uma palavra de cautela : Mesmo que as opções acima funcionem, geralmente é uma má idéia estender qualquer host ou objeto nativo
.prototype
. Fiz aqui porque se encaixa muito bem no problema. De qualquer forma, você provavelmente deve usar essa função fora do.prototype
e passar o objeto para ele.fonte
.toString()
comoobj[ key ].toString()
e ao valor, se desejado ...Como dito, a iteração é necessária. Por exemplo, no navegador moderno, você pode ter:
Onde
value
contém o valor que você está procurando. Disse que eu provavelmente usaria um loop.Caso contrário, você poderá usar um objeto "hashmap" adequado - existem várias implementações no JS ao redor - ou implementar por conta própria.
ATUALIZAÇÃO 2018
Seis anos se passaram, mas ainda recebo voto aqui, então sinto que uma solução mais moderna - para navegador / ambiente moderno - deve ser mencionada na resposta em si e não apenas nos comentários:
Claro que também pode ser uma função:
fonte
Object.keys(obj).or(o=>o[key] === value)
or
da matriz método, e não está claro para mim seu objetivo aqui: vou apreciar alguns detalhes adicionais! :)or
certeza! Foi avaliado e aceito apenas recentemente (acho que ninguém o implementa ainda). O que ele faz é encontrar o primeiro elemento de uma matriz correspondente a um predicado e retorná-lo. Então[1,2,3,4].or(x=>x>2)
voltaria3
e[1,2,3,4,5].or(x=>x<3)
voltaria1
. Algo como FirstOrDefault C # 's :)or
método? Pelo que você mencionou, parece que ele retorna o item que corresponde ao predicado "ou" a própria matriz?or
foi renomeado. Eu acredito que agora você deve usar o find .A maneira lodash https://lodash.com/docs#findKey
fonte
_.findKey(users, { 'age': 1, 'active': true });
... é o mesmo_.find_key({a: "A", b:"B"}, "B"})
retornosundefined
conforme indicado aqui que você precisa fazer_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Feito para o compilador de fechamento para extrair o nome da chave que será desconhecido após a compilação
Versão mais sexy, mas usando a
Object.entries
função futurafonte
Object.entries(obj).find(i => i[1] === val);
usar emfilter
vez dissoObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + One Liners
Retorne todas as chaves com o valor:
fonte
Eu uso esta função:
Uso:
fonte
obj.hasOwnProperty(key)
ou é desnecessário neste caso?Função principal:
Objeto com chaves e valores:
Teste:
fonte
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Exemplo:
fonte
Se você estiver trabalhando com a biblioteca Underscore ou Lodash , poderá usar a função _.findKey :
fonte
Criei a biblioteca bimap ( https://github.com/alethes/bimap ) que implementa uma interface de mapa bidirecional JavaScript poderosa, flexível e eficiente. Ele não possui dependências e é utilizável no servidor (no Node.js, você pode instalá-lo
npm install bimap
) e no navegador (vinculando-se a lib / bimap.js ).As operações básicas são realmente simples:
A recuperação do mapeamento de valores-chave é igualmente rápida nas duas direções. Não há travessias caras de objetos / matrizes sob o capô, portanto o tempo médio de acesso permanece constante, independentemente do tamanho dos dados.
fonte
não viu o seguinte:
fonte
Como os valores são únicos, deve ser possível adicionar os valores como um conjunto adicional de chaves. Isso pode ser feito com o seguinte atalho.
Isso permitiria a recuperação por meio da chave ou do valor:
Isso pressupõe que não há elementos comuns entre as chaves e os valores.
fonte
Dado
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):fonte
output['x']
. Era isso que você estava perguntando?http://jsfiddle.net/rTazZ/2/
fonte
Ou, mais fácil ainda - crie um novo objeto com as chaves e os valores na ordem que você deseja e, em seguida, procure esse objeto. Tivemos conflitos usando os códigos de protótipo acima. Você não precisa usar a função String ao redor da tecla, isso é opcional.
fonte
Esta é uma pequena extensão do método Underscorejs e usa o Lodash :
FindKey irá procurar e retornar a primeira chave que corresponde ao valor.
Se você deseja a última correspondência, use FindLastKey .
fonte
Como se essa pergunta não tivesse sido derrotada ...
Aqui está um apenas para qualquer curiosidade que isso traz a você ...
Se você tem certeza de que seu objeto terá apenas valores de sequência, você pode realmente se cansar de conjurar esta implementação:
Talvez haja algo útil para construir daqui ...
Espero que isso diverte você.
fonte
Aqui está uma solução Lodash para isso que funciona para o objeto chave => value, em vez de um objeto aninhado. A sugestão da resposta aceita de usar
_.findKey
funciona para objetos com objetos aninhados, mas não funciona nessa circunstância comum.Essa abordagem inverte o objeto, trocando chaves por valores e, em seguida, localiza a chave pesquisando o valor no novo objeto (invertido). Se a chave não for encontrada,
false
será retornada, o que eu prefiroundefined
, mas você pode facilmente trocá-la no terceiro parâmetro do_.get
métodogetKey()
.fonte
Aqui está a minha solução primeiro:
Por exemplo, suponho que tenhamos um objeto que contenha três pares de valores:
Podemos simplesmente escrever uma findKey (matriz, valor) que aceita dois parâmetros que são um objeto e o valor da chave que você está procurando. Como tal, esse método é reutilizável e você não precisa iterar manualmente o objeto todas as vezes passando apenas dois parâmetros para esta função.
fonte
Métodos ES6 :
fonte
Eu normalmente recomendo lodash em vez de sublinhado.
Se você tiver, use-o.
Caso contrário, considere usar o pacote lodash.invert npm, que é bem pequeno.
Veja como você pode testá-lo usando gulp:
1) Crie um arquivo chamado gulpfile.js com o seguinte conteúdo:
2) Instale o pacote lodash.invert e gulp
3) Teste se funciona:
Referências
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Diferenças entre lodash e sublinhado
https://github.com/gulpjs/gulp
fonte
Sublinhar a solução js
fonte
isso funcionou para eu obter a chave / valor do objeto.
fonte
Realmente simples.
fonte
Mantenha simples!
Você não precisa filtrar o objeto por métodos ou bibliotecas sofisticados, o Javascript possui uma função integrada chamada Object.values .
Exemplo:
Isso retornará os dados da propriedade do objeto.
Referências
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
fonte