Skip to content
Grigoriev Oleg edited this page Apr 2, 2013 · 2 revisions

go.Lang.reduce(), go.Lang.reduceRight(): объединение набора значений

reduce(items, callback [, initialValue]) - левоассоциативное объединение

reduceRight(items, callback [, initialValue]) - правоассоциативное объединение

  • items {(Array|Object)} - набор значений (список или словарь)
  • callback {(Function|Object)} - функция-редуктор (сама функция или [callback, context])
  • initialValue {*} - начальное значение
  • :return {*} - результат объединения

Функции совместимы с ES5-фунциями array.reduce и array.reduceRight со следующими расширениями:

  • Перебирать можно не только массивы, но и объекты.
  • Можно указывать контекст для callback. Так, как отдельным аргументом context сделать сложно (непонятно было ли указано initialValue) - пришлось сделать небольшое извращения. Для указания контекста, вместо callback следует передать массив [метод, объект]. Например: [instance.method, instance].

Пример

Сумма всех элементов:

items = [1, 2, 3, 4, 5];
sum = go.Lang.reduce(items, function (prev, current) {return prev + current; });

Вызов callback

callback вызывается (в указанном контексте) для каждого элемента из набора со следующими аргументами:

  • perviousValue - текущее значение редукции
  • currentValue - значение текущего элемента
  • index - индекс массива или ключ словаря
  • items - исходный набор
  • :return - очередное значение редукции. Используется в качестве perviousValue на следующем шаге или в качестве результата, если этот шаг последний.

initialValue

При указании аргумента initialValue, он становится исходным значением редукции (perviousValue на первом шаге). И перебор начинается с первого элемента набора.

Если не указан, для perviousValue берётся первый элемент, а перебор начинается со второго.

Ассоциативность и словари

При указании в качестве items объекта, перебираются его собственные элементы (элементы из прототипов не затрагиваются).

Так, как порядок перебора объектов зависит от реализации в браузере, то корректный результат дают только коммутативные операции (сложение, умножение) и им подобные.

Исходя из этого - reduce() и reduceRight() не отличаются для словарей.

Clone this wiki locally