javascript:使用lodash / fp流程返回对象

时间:2017-03-24 14:42:05

标签: javascript functional-programming lodash

我正在将一个_.chain函数组转换为使用_fp.flow,但是在处理流程复杂对象的方式时遇到了一些困难。我想

  1. 将具有某些分组功能的对象数组(例如countBy / sumBy)缩减为对象/词典(例如{ group1:10, group2:15... }
  2. 将其映射到键/值对数组(例如[{column: 'group1', value: '10'}, ...]
  3. 按某个变量排序为asc/desc订单
  4. 但是现在最终的对象最终变成了一个长数组。代码示例如下。下面代码中的reducer函数正常工作并按照我的意图对值进行分组,但我认为each步和orderBy之间的讨论会以某种方式使对象变平(所需的) _.each中的console.log后,对象形成正确。

    我在附加的JSFiddle中放了一些代码示例。

    const inData = [{
      target: 123,
      groupby: 'a'
    },...
    }];
    
    const colData = _.flow(
      _.reduce(reducer, {}),
      _.toPairs,
      _.each(([value, column]) => {
        console.log(value); 
        console.log(column);
        const outObj = {
            value: value,
          column: column
        }
        console.log(outObj)
        return (outObj);
      }),
      _.orderBy(['value'], [sortDir]),
      // Have tried result with or without fromPairs 
        _.fromPairs 
    )(inData);
    

    PS:我在我的主项目中使用ES6语法和React,如果这有所不同。

    https://jsfiddle.net/moc0L5ac/

2 个答案:

答案 0 :(得分:1)

您需要使用map代替each,并将[value, column]的顺序修正为[column, value]

const colData = _.flow(
  _.reduce(reducer, {}),
  _.toPairs,
  _.map(([column, value]) => {
      const outObj = {
        value: value,
        column: column
      }
      return outObj;
    }),
  _.orderBy(['value'], [sortDir])
)(inData);

答案 1 :(得分:1)

根据我的理解,这是你想要完成的事情

const inData =
  [ { target: 123, groupby: 'a' },
    { target: -123, groupby: 'b' },
    { target: 123, groupby: 'a' },
    { target: -123, groupby: 'b' } ]

const colData = _.flow(
  _.reduce((map, {target:v, groupby:k}) =>
    Object.assign(map, { [k]: map[k] === undefined ? v : map[k] + v }), {}),
  _.toPairs,
  _.map(([column, value]) => ({ column, value }))
)

console.log(colData(inData));
// => [ { column: 'a', value: 246 },
//      { column: 'b', value: -246 } ]