Есть хороший метод Array reduce()
для получения одного значения из Array. Пример:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
Как лучше всего добиться того же с объектами? Я хотел бы сделать это:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
Тем не менее, объект, кажется, не reduce()
реализован ни один метод.
javascript
arrays
object
reduce
Павел С.
источник
источник
Underscore.js
?reduce
метод. Я бы проверил там. Тем не менее, решение не кажется таким сложным._
, есть сокращение для объектов. Не уверен, что он работает случайно или если поддержка объекта была преднамеренной, но вы действительно можете передать объект, как в примере этого вопроса, и он (концептуально) будетfor..in
вызывать вашу функцию итератора со значениями, найденными в каждом ключе.Ответы:
Что вы на самом деле хотите в этом случае, так это
Object.values
. Вот краткая реализация ES6 с учетом этого:или просто:
источник
Одним из вариантов было бы :
reduce
keys()
При этом вы захотите указать начальное значение или 1-й раунд будет
'a' + 2
.Если вы хотите получить результат как Object (
{ value: ... }
), вам придется каждый раз инициализировать и возвращать объект:источник
@babel/plugin-proposal-object-rest-spread
плагин, я распределил значение аккумулятора в Возврат снижения и это работает как обаяние, но я был удивлен, если я делаю что-то не так, потому что я передавал объект первоначальному значению уменьшения, и ваш ответ доказал мне, что я поступил правильно!Реализация ES6: Object.entries ()
источник
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
наfunction (total, [key, value])
entries
это более чистый способ сделать этоkeys
, он менее производительный. hackernoon.com/…Прежде всего, вы не совсем получить то , что уменьшить «s предыдущее значение.
В вашем псевдокоде, который у вас есть
return previous.value + current.value
, поэтомуprevious
значением будет следующий номер вызова, а не объект.Во-вторых,
reduce
это метод Array, а не метод Object, и вы не можете полагаться на порядок при выполнении итерации свойств объекта (см .: https://developer.mozilla.org/en-US/docs/ JavaScript / Reference / Statements / for ... in , это также применимо к Object.keys ); поэтому я не уверен, имеет лиreduce
смысл применять к объекту.Однако, если заказ не важен, вы можете иметь:
Или вы можете просто отобразить значение объекта:
PS в ES6 с синтаксисом функции жирной стрелки (уже в Firefox Nightly) вы можете немного уменьшить:
источник
1:
2:
3:
источник
Объект можно превратить в массив с помощью: Object.entries () , Object.keys () , Object.values () , а затем уменьшить в массив. Но вы также можете уменьшить объект, не создавая промежуточный массив.
Я создал небольшую вспомогательную библиотеку odict для работы с объектами.
У него есть
reduce
функция, которая очень похожа на Array.prototype.reduce () :Вы также можете назначить его:
так как этот метод очень полезен!
Таким образом, ответ на ваш вопрос будет:
источник
Расширить Object.prototype.
Образец использования.
нет, ребята !! ;-)
источник
Object.entries()
в 2021 годуВы можете использовать выражение генератора (поддерживается во всех браузерах уже несколько лет и в Node), чтобы получить пары ключ-значение в списке, в котором вы можете сократить:
источник
Если вы можете использовать массив, используйте массив, длина и порядок массива вдвое меньше.
/ * возвращаемое значение: (число) 6 * /
источник
Это не очень сложно реализовать самостоятельно:
В действии:
Вы также можете добавить его в прототип Object:
источник
Поскольку это еще не подтверждено в ответе, Underscore
reduce
также работает для этого.Обратите внимание,
_.reduce
вернет единственное значение (объект или иное), если объект списка имеет только один элемент, без вызова функции итератора.источник
Попробуйте эту функцию стрелки один вкладыш
источник
Попробуй это. Он будет сортировать числа из других переменных.
источник