【问题标题】:Javascript JSON mutli group rows by value and objects (nested)Javascript JSON mutli 按值和对象对行进行分组(嵌套)
【发布时间】:2018-03-05 11:41:50
【问题描述】:

我尝试了一段时间用 lodash .groupBy 转换我的数据

这是一个常见的情况:订单行有折扣(或没有折扣)

从这里

data = [  {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":1,"item":"itemA","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.2}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":2,"item":"itemB","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.5}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":2,"item":"itemB","discounts":{"lineDiscountPosition":2,"discountReasonCode":12,"discountRate":0.5}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":3,"item":"itemD","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}}},
    {"order":"O2","headerO1":"660123","lastUpdateDate":"2018-03-04T23:23:00.000Z","detailLines":{"linePosition":1,"item":"itemA"}},
    {"order":"O2","headerO1":"660123","lastUpdateDate":"2018-03-04T23:23:00.000Z","detailLines":{"linePosition":2,"item":"itemD","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}}}
    ]

到这个结果

var data = [
{"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z",
  "detailLines": [
    {"linePosition":1,"item":"itemA",
      "discounts":
        {"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.2}
    },
    {"linePosition":2,"item":"itemB",
      "discounts":[
        {"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.5},
        {"lineDiscountPosition":2,"discountReasonCode":12,"discountRate":0.5}
       ]
    },
    {"linePosition":3,"item":"itemD",
      "discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}
    }
  ]
},
{"order":"O2","headerO1":"660123","lastUpdateDate":"2018-03-04T23:23:00.000Z",
  "detailLines": [
    {"linePosition":1,"item":"itemA"},
    {"linePosition":2,"item":"itemD",
      "discounts":
        {"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}
    }
  ]
}
]

它可以是 lodash、纯 javascript (node.js) 或其他库的解决方案。

到目前为止我尝试过:

var grouped = _.chain(data).sortBy('order.detailLines.linePosition')
    .groupBy('order.detailLines.linePosition'); 
console.log(JSON.stringify(grouped ,null,' ')); 

我想我可能需要一个关于 groupBy 的循环?

感谢您的帮助

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么吗?
  • var grouped = _.chain(data) .sortBy('order.detailLines.linePosition') .groupBy('order.detailLines.linePosition') ; console.log(JSON.stringify(grouped ,null,' '));也许需要一个 groupBy 循环?

标签: javascript node.js lodash


【解决方案1】:

想试试这个吗? 请注意,reduce 是从右侧开始的,因为我在行项目之前添加了构造数组。

data = [  {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":1,"item":"itemA","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.2}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":2,"item":"itemB","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.5}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":2,"item":"itemC","discounts":{"lineDiscountPosition":2,"discountReasonCode":12,"discountRate":0.5}}},
    {"order":"O1","headerO1":"559518","lastUpdateDate":"2018-03-02T11:17:02.748Z","detailLines":{"linePosition":3,"item":"itemD","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}}},
    {"order":"O2","headerO1":"660123","lastUpdateDate":"2018-03-04T23:23:00.000Z","detailLines":{"linePosition":1,"item":"itemA"}},
    {"order":"O2","headerO1":"660123","lastUpdateDate":"2018-03-04T23:23:00.000Z","detailLines":{"linePosition":2,"item":"itemD","discounts":{"lineDiscountPosition":1,"discountReasonCode":12,"discountRate":0.4}}}
    ]
    
console.log(
_.chain(data)
  .groupBy('order')
  .mapValues(details => ({
    ...details[0],
    detailLines: details.map(({ detailLines }) => detailLines)
  }))
  .values()
  .value()
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

【讨论】:

  • 很好的结果 Markus.For "order": "O1"."detailLines",我们应该只有一个 "linePosition": 2 和一个由 2 个对象组成的数组 {"lineDiscountPosition"... } .还有一点,我在单元测试中的错误 "linePosition":2,"item":"itemB" 必须有项目(不是 "linePosition":2,"item":"itemC"):将其修复到我的第一篇文章中跨度>
  • 我简化了我的代码。您应该能够通过以嵌套方式添加相同的逻辑来对您的 linePositions 进行分组。
猜你喜欢
  • 2016-07-09
  • 2012-11-25
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多