【问题标题】:How to merge/group two values of array objects by dates如何按日期合并/分组数组对象的两个值
【发布时间】:2019-07-11 13:23:46
【问题描述】:

我正在尝试使用 Amchart Multiple Values 显示图表,信息来自 ElasticSearch。这是我的 JS 代码:

$.get(URI).then(resp => JSON.parse(resp))
            .then(values => {
                console.log(values)
                var data = [],
                values.map(e => e._source) //From Elastic the info is inside '_source' key  
                    .map((n, i) => {
                        n.date = moment(n.date).format('Y-MM-DD');
// I'm trying to format date, because it cames with Hour:Min:Sec and if I 
// try to compare dates it wont be equal (NOT USING IN THIS ATTEMPT)
                        if (n.warehouse.name === 'General') {
                            data.push({date: n.date, general: n.assessment});
                        } else {
                            data.push({date: n.date, intransit: n.assessment});
                        }

                    });

            })
            .fail(err => console.error(err.response));

这是这段代码的输出:


0: {date: "2019-07-10", intransit: 1234.23}
1: {date: "2019-07-10", general: 1234.23}
2: {date: "2019-07-12", intransit: 1234.23}
3: {date: "2019-07-12", general: 1234.23}

如您所见,日期重复,我如何合并/组合两者但又不丢失价值? 信息必须是这样的:

0: {date: "2019-07-10", intransit: 1234.23, general: 1234.23}
2: {date: "2019-07-12", intransit: 1234.23, general: 1234.23}

如果您无法从 Elastic 中可视化结构,这是 console.log(values) 的输出:

_source: {date: "2019-07-10", assessment: 123.12, 
warehouse: {id: 1, name: "General"}

我尝试过使用 Lodash/UnderscoreJS、循环等...但什么也没有。如果您对此有任何建议或任何信息,将不胜感激。 谢谢。

【问题讨论】:

    标签: javascript object lodash


    【解决方案1】:

    使用 reduce() 创建 groupBy 对象或使用日期作为键的 Map 然后返回 values

    const data = [ {date: "2019-07-10", intransit: 1234.23}, {date: "2019-07-10", general:1234.23}, {date: "2019-07-12", intransit: 1234.23},{date: "2019-07-12", general:1234.23}]
    
    const res = Object.values(
      data.reduce((a, c) => {
        a[c.date] = a[c.date] || {};
        Object.assign(a[c.date], c);
        return a;
      }, {})
    )
    
    
    console.log(res)

    【讨论】:

    • 谢谢!我不知道你为什么投了反对票,但这对我有用。
    【解决方案2】:

    这里是基于Lodash-fp的解决方案

    const dateMerger = _.flow([
        _.groupBy('date'),
        _.values,
        _.map(_.reduce(_.merge, {}))
    ]);
    
    const dateData = [
        {date: "2019-07-10", intransit: 1234.23},
        {date: "2019-07-10", general: 1234.23},
        {date: "2019-07-12", intransit: 1234.23},
        {date: "2019-07-12", general: 1234.23}
    ];
    
    console.log(dateMerger(dateData));
    

    【讨论】:

    • 我收到此错误:无法读取未定义的属性“未定义”,也许我没有使用 lodash 的真实 URL? --}}
    • 不,它是 Lodash-fp,经典 Lodash 的全功能编程变体。插入此 <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script> 以测试 CDN。这里有文档https://github.com/lodash/lodash/wiki/FP-Guide
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多