Existe um bom método Array reduce()
para obter um valor a partir da matriz. Exemplo:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
Qual é a melhor maneira de conseguir o mesmo com objetos? Eu gostaria de fazer isso:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
No entanto, o objeto não parece ter nenhum reduce()
método implementado.
javascript
arrays
object
reduce
Pavel S.
fonte
fonte
Underscore.js
?reduce
método. Eu verificaria lá. Porém, a solução não parece tão difícil._
, tem uma redução para objetos. Não tenho certeza se funciona acidentalmente ou se o suporte a objetos foi intencional, mas, de fato, você pode passar um objeto como no exemplo desta pergunta, e será (conceitualmente)for..in
, chamando sua função de iterador com os valores encontrados em cada chave.Respostas:
O que você realmente deseja neste caso é o
Object.values
. Aqui está uma implementação concisa do ES6 com isso em mente:ou simplesmente:
fonte
Uma opção seria
reduce
akeys()
:Com isso, você desejará especificar um valor inicial ou a 1ª rodada será
'a' + 2
.Se você deseja o resultado como um Object (
{ value: ... }
), precisará inicializar e retornar o objeto sempre:fonte
@babel/plugin-proposal-object-rest-spread
plug-in, espalhei o valor do acumulador em retorno de reduzir e funciona como um encanto, mas eu estava pensando se estou fazendo algo errado, porque eu estava passando o objeto para o valor inicial de reduzir e sua resposta me provou que eu fiz a coisa certa!Implementação do ES6: Object.entries ()
fonte
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
parafunction (total, [key, value])
entries
seja uma maneira mais limpa de fazer issokeys
, é menos eficiente. hackernoon.com/...Primeiro de tudo, você não entende exatamente o que é o valor anterior da redução .
No seu pseudo-código, você tem
return previous.value + current.value
, portanto, oprevious
valor será um número na próxima chamada, não um objeto.Segundo,
reduce
é um método Array, não o de um Objeto, e você não pode confiar na ordem ao iterar as propriedades de um objeto (consulte: https://developer.mozilla.org/en-US/docs/ JavaScript / Reference / Statements / for ... in , isso também é aplicado a Object.keys ); portanto, não tenho certeza se a aplicaçãoreduce
sobre um objeto faz sentido.No entanto, se o pedido não for importante, você pode ter:
Ou você pode apenas mapear o valor do objeto:
PS no ES6 com a sintaxe da função de seta gorda (já no Firefox Nightly), você pode diminuir um pouco:
fonte
1:
2:
3:
fonte
Estenda Object.prototype.
Amostra de uso.
Não, rapazes !! ;-)
fonte
Object.entries()
em 2021Você pode usar uma expressão de gerador (suportada em todos os navegadores há anos e no Nó) para obter os pares de valores-chave em uma lista que você pode reduzir:
fonte
Um objeto pode ser transformado em uma matriz com: Object.entries () , Object.keys () , Object.values () e, em seguida, ser reduzido como matriz. Mas você também pode reduzir um objeto sem criar a matriz intermediária.
Eu criei uma pequena biblioteca auxiliar odict para trabalhar com objetos.
Tem uma
reduce
função que funciona muito como Array.prototype.reduce () :Você também pode atribuí-lo a:
como este método é muito útil!
Portanto, a resposta para sua pergunta seria:
fonte
Se você pode usar uma matriz, use uma matriz, o comprimento e a ordem de uma matriz são metade do seu valor.
/ * valor retornado: (Número) 6 * /
fonte
Isso não é muito difícil de se implementar:
Em ação:
Você também pode adicioná-lo ao protótipo de objeto:
fonte
Como ainda não foi realmente confirmado em uma resposta, o Underscore
reduce
também funciona para isso.Observe
_.reduce
que retornará o único valor (objeto ou não) se o objeto da lista tiver apenas um item, sem chamar a função de iterador.fonte
Experimente esta função de seta única
fonte
Tente este. Ele classificará números de outras variáveis.
fonte