2017-02-13 11 views
0

Я только начинаю с highland.js и потоков в узле, и я застреваю, пытаясь рассчитать min/max/mean некоторых чисел. Это то, что я до сих пор:nodejs: вычислить среднее значение с высокогорными потоками

const _ = require('highland'); 

const input = [ 
{ val: 1 }, 
{ val: 2 }, 
{ val: 3 }, 
]; 

_(input) 
    .reduce((acc, { val }) => { 
    if (typeof acc.min === 'undefined' || val < acc.min) { 
     acc.min = val; 
    } 
    if (typeof acc.max === 'undefined' || val > acc.max) { 
     acc.max = val; 
    } 
    acc.count = (acc.count || 0) + 1; 
    acc.sum = (acc.sum || 0) + val; 
    return acc; 
    }, {}); 

Если я после этого делать, скажем, toCallback и console.log результат я получаю {min: 1, max: 3, count: 3, sum: 6} но я не заинтересован в счете и сумма полей, я хочу, чтобы объект как {min: 1, max: 3, mean: 2} ,

Однако, поскольку возвращение сокращения является объектом, нет ничего Нагорье может с ним справиться - я могу только потреблять его, но я хотел бы сделать среднее в горной местности.

Как я могу продолжить здесь или как мне реорганизовать код для получения этого среднего?

+0

Не уверены, хайленд версию вы используете, но код вы вывесили выдает ошибку как «функция F не определен» , Я поменял местами. Извлеките аргументы (сначала передал {}, а затем функцию), и он начал работать. –

+0

Я использую '3.0.0-beta.3', который действительно перевернул аргументы args для уменьшения из ветки 2.x. –

ответ

0

Вы можете попробовать использовать горский .map метод как это:

_(input) 
 
\t .reduce({}, (acc, {val}) => { 
 
\t \t if (typeof acc.min === 'undefined' || val < acc.min) { 
 
\t \t \t acc.min = val; 
 
\t \t } 
 
\t \t if (typeof acc.max === 'undefined' || val > acc.max) { 
 
\t \t \t acc.max = val; 
 
\t \t } 
 
\t \t acc.count = (acc.count || 0) + 1; 
 
\t \t acc.sum = (acc.sum || 0) + val; 
 
\t \t return acc; 
 
\t }) 
 
\t .map(stats => { 
 
\t \t return { 
 
\t \t \t min: stats.min, 
 
\t \t \t max: stats.max, 
 
\t \t \t mean: stats.sum/stats.count 
 
\t \t }; 
 
\t }) 
 
\t .toCallback(function (err, data) { 
 
\t \t //Contains the data structure you need 
 
\t \t console.log(data); 
 
\t });

+0

Спасибо, этот ответ работает, и я собираюсь его одобрить. То, что меня смутило, было то, что «сокращение» вернуло объект, и я пытался следовать ему с помощью «flatMap» вместо «map», который затем выдал ошибку. –

+0

Как побочная заметка, я закончил ее с помощью «бегущей средней» формулы, которая не нуждается в счете: 'mean = (mean * (n - 1) + val)/n', где' n' - итерация номер –