2017-03-24 9 views
0

我正在将一个_.chain组函数转换为使用_fp.flow,但我在处理流程处理复杂对象方面遇到了一些困难。我试图javascript:使用lodash/fp流来返回对象

  1. 减少对象的数组与一些分组的功能(例如countBy/sumBy)到对象/字典(例如{ group1:10, group2:15... }
  2. 地图成键/值对的阵列(例如[{column: 'group1', value: '10'}, ...]
  3. 排序一些可变进asc/desc顺序

但现在生成的对象最终被展平为长阵列。代码示例如下。在下面的代码的reducer功能工作正常,当我意欲分组的值,但然后我认为each步骤和orderBy之间的钻营被平坦化该对象以某种方式(在console.log_.each后正确地形成所需的对象。

我已经把所附的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语法和我的主要项目反应过来,如果有差别

https://jsfiddle.net/moc0L5ac/

+0

你说什么应包括样本数据和预期产出 – naomik

回答

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

据我的理解,这就是你要找完成

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 } ]