Istnieje ładna metoda Array, która reduce()
pozwala uzyskać jedną wartość z tablicy. Przykład:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
Jaki jest najlepszy sposób na osiągnięcie tego samego w przypadku przedmiotów? Chciałbym to zrobić:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
Jednak Object nie wydaje się mieć reduce()
zaimplementowanej żadnej metody.
javascript
arrays
object
reduce
Paweł S.
źródło
źródło
Underscore.js
?reduce
metodę. Tam sprawdziłbym. Chociaż rozwiązanie nie wydaje się takie trudne._
, ma redukcję dla obiektów. Nie jestem pewien, czy zadziała to przez przypadek, czy też obsługa obiektów była celowa, ale rzeczywiście możesz przekazać obiekt, jak w przykładzie z tego pytania, i będzie to (koncepcyjnie)for..in
, wywołując funkcję iteratora z wartościami znalezionymi w każdym kluczu.Odpowiedzi:
To, czego tak naprawdę chcesz w tym przypadku, to
Object.values
. Oto zwięzła implementacja ES6, mając to na uwadze:lub po prostu:
źródło
Jedną z możliwości byłoby :
reduce
keys()
Dzięki temu będziesz chciał określić wartość początkową lub pierwsza runda będzie
'a' + 2
.Jeśli chcesz, aby wynik był Object (
{ value: ... }
), będziesz musiał zainicjować i zwrócić obiekt za każdym razem:źródło
@babel/plugin-proposal-object-rest-spread
wtyczki, rozłożyłem wartość akumulatora w powrót redukuje i działa jak urok ale zastanawiałem się czy robię coś złego bo przepuszczałem obiekt do początkowej wartości redukuj a twoja odpowiedź udowodniła mi że zrobiłem dobrze!Implementacja ES6: Object.entries ()
źródło
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
nafunction (total, [key, value])
entries
jest to czystszy sposób na zrobienie tegokeys
, jest mniej wydajny. hackernoon.com/…Po pierwsze, nie do końca rozumiesz, jaka jest poprzednia wartość redukcji .
W twoim pseudokodzie, który masz
return previous.value + current.value
, dlategoprevious
wartość będzie liczbą przy następnym wywołaniu, a nie obiektem.Po drugie,
reduce
jest to metoda Array, a nie Object, i nie można polegać na kolejności podczas iteracji właściwości obiektu (patrz: https://developer.mozilla.org/en-US/docs/ JavaScript / Reference / Statements / for ... in , dotyczy to również Object.keys ); więc nie jestem pewien, czy nakładaniereduce
na obiekt ma sens.Jeśli jednak kolejność nie jest ważna, możesz mieć:
Lub możesz po prostu zmapować wartość obiektu:
PS w ES6 ze składnią funkcji grubej strzałki (już w Firefox Nightly), możesz trochę zmniejszyć:
źródło
1:
2:
3:
źródło
Rozszerz Object.prototype.
Próbka użycia.
Radujcie się, chłopaki !! ;-)
źródło
Object.entries()
w 2021 r.Możesz użyć wyrażenia generatora (obsługiwanego od lat we wszystkich przeglądarkach oraz w Node), aby uzyskać pary klucz-wartość na liście, którą możesz zmniejszyć:
źródło
Obiekt można przekształcić w tablicę za pomocą: Object.entries () , Object.keys () , Object.values () , a następnie zredukować jako tablicę. Ale możesz także zredukować obiekt bez tworzenia tablicy pośredniej.
Stworzyłem małą pomocniczą bibliotekę odict do pracy z obiektami.
Posiada
reduce
funkcję, która działa bardzo podobnie do Array.prototype.reduce () :Możesz również przypisać go do:
ponieważ ta metoda jest bardzo przydatna!
Tak więc odpowiedź na twoje pytanie brzmi:
źródło
Jeśli możesz użyć tablicy, użyj tablicy, długość i kolejność tablicy to połowa jej wartości.
/ * zwrócona wartość: (liczba) 6 * /
źródło
Nie jest to trudne do wykonania samodzielnie:
W akcji:
Możesz również dodać go do prototypu obiektu:
źródło
Ponieważ tak naprawdę nie zostało to jeszcze potwierdzone w odpowiedzi, funkcja Underscore
reduce
również się sprawdza.Uwaga,
_.reduce
zwróci jedyną wartość (obiekt lub inną), jeśli obiekt listy ma tylko jedną pozycję, bez wywoływania funkcji iteratora.źródło
Wypróbuj tę jedną funkcję strzałki liniowej
źródło
Spróbuj tego. Sortuje liczby z innych zmiennych.
źródło