【问题标题】:lodash Arrays of Arrayslodash 数组的数组
【发布时间】:2018-08-09 07:42:43
【问题描述】:

您好,我有这样的数据

newProcessData: [
  {
    "processType": "ABC Type1", 
    "processSource": "ABC Source1",
    "groupName": "G1",
    "breakdowns": [
      {
        "size": 'S",
        "quantity": 20,
      },
    ],

  },{
    "processType": "ABC Type2", 
    "processSource": "ABC Source2",
    "groupName": "G2",
    "history": [
      {
        "size": 'S",
        "quantity": 20,
      },{
      "size": 'XL",
      "quantity": 20,
      }
    ],
    "breakdowns": [
      {
        "size": 'S",
        "quantity": 20,
      },{
      "size": 'XL",
      "quantity": 20,
      }
    ],

  },
];

首先我做 GroupData 以按 groupName 对数据进行排序

    let groupByData = _.groupBy(newProcessData, 'groupName')

然后我使用 Lodash map 填充所有数组数据,

我的目标是使用 _.sumBy 显示故障数量、历史记录并显示流程类型

       {_.map(groupByData, (v, idx) => {
      <Table>
       <TableBody displayRowCheckbox={false}>
         <TableRow>
           <TableRowColumn style={{textAlign: 'right'}}>{ " sum of all the quantity of breakdowns"}</TableRowColumn>
 <TableRowColumn style={{textAlign: 'right'}}>{ " sum of all the quantity of history"}</TableRowColumn>
 <TableRowColumn style={{textAlign: 'right'}}>{ "Get the processType name"}</TableRowColumn>
         </TableRow>
       </TableBody>
     </Table>
     })}

任何帮助将不胜感激

【问题讨论】:

    标签: reactjs ecmascript-6 lodash


    【解决方案1】:

    您的groupByData 是一个对象。您需要取回数组,以便可以使用map 对其进行迭代。使用values,您将获得groupByData 的所有值,然后在每个数组上遍历map,您可以使用forEach 遍历每个数组并使用sumBy 对每个数组的所有breakdowns 求和对象。

    var newProcessData = [ { "processType": "ABC Type1", "processSource": "ABC Source1", "groupName": "G1", "breakdowns": [ { "size": "S", "quantity": 20, }, ], },{ "processType": "ABC Type2", "processSource": "ABC Source2", "groupName": "G2", "breakdowns": [{ "size": "S", "quantity": 20 } ] }],
      groupByData = _.groupBy(newProcessData, 'groupName'),
      summed = _.map(_.values(groupByData), a => { 
        _.forEach(a, o => {
          sum = _.sumBy(o.breakdowns, 'quantity');
          console.log(sum);
        });
      });
    console.log(groupByData);
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 嗨@Hassan 感谢您对代码的澄清,您可以再次看到编辑问题,我尝试添加另一个我想实际显示的对象。我在获取 processType 对象时遇到了问题,因为我已经在显示区域中使用了 _.map
    【解决方案2】:

    你可以使用更实用的风格来获得你想要的东西。希望代码能够充分解释自身(如果您需要进一步说明,请在 cmets 中告诉我)。

    使用 lodash fp,代码会更加简洁(您可以去掉部分代码),但是,我认为您使用的不是那个版本,所以我决定使用“正常”的解决方案" lodash。

    希望对你有帮助。

    const groupByGroupName = _.partial(_.groupBy, _, 'groupName');
    const getBreakdowns = _.partial(_.get, _, 'breakdowns');
    const addBreakdownQtties = _.partial(_.sumBy, _, 'quantity');
    const getBreakdownQtty = _.flowRight(addBreakdownQtties, getBreakdowns);
    const getBreakdownsQtties = _.partial(_.map, _, getBreakdownQtty);
    const getQttiesGroupedByName = _.partial(_.mapValues, _, getBreakdownsQtties);
    const addGroupQtties = _.partial(_.mapValues, _, _.sum);
    const getTotalsByGroupName = _.flowRight(addGroupQtties, getQttiesGroupedByName, groupByGroupName);
    
    const newProcessData = [{
        "processType": "ABC Type1",
        "processSource": "ABC Source1",
        "groupName": "G1",
        "breakdowns": [{
          "size": "S",
          "quantity": 20,
        },
        {
          "size": "S",
          "quantity": 10,
        },
        {
          "size": "S",
          "quantity": 15,
        }]
      },
      {
        "processType": "ABC Type1",
        "processSource": "ABC Source1",
        "groupName": "G1",
        "breakdowns": [{
          "size": "S",
          "quantity": 20,
        },
        {
          "size": "S",
          "quantity": 10,
        },
        {
          "size": "S",
          "quantity": 15,
        }]
      },
      {
        "processType": "ABC Type2",
        "processSource": "ABC Source2",
        "groupName": "G2",
        "breakdowns": [{
          "size": "S",
          "quantity": 20,
        }]
      }
    ];
    
    console.log("Total quantities grouped by name", getTotalsByGroupName(newProcessData));
    &lt;script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 嗨@acontell 谢谢,这真的很有帮助,我尝试添加更多信息,因为 groupBy 它将变为对象而不是数组(如果我错了,请纠正我)问题是我想使用_.map 在我的显示区域(在我的表格行中)我应该使用 _.get (v, 'processType') 吗?
    猜你喜欢
    • 2019-08-22
    • 1970-01-01
    • 2017-02-22
    • 2016-09-15
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2015-09-04
    相关资源
    最近更新 更多