【问题标题】:Grouping data with JavaScript (linq.js) with multiple grouping criteria?使用具有多个分组条件的 JavaScript (linq.js) 对数据进行分组?
【发布时间】:2015-02-16 09:55:03
【问题描述】:

我已经阅读堆栈溢出有一段时间了,发现这次我有一个自己的问题要发布,因为我找不到答案。我对 Javascript 还是很陌生,而且由于大量使用 SQL、Qlikview 和 VBA 的工作,我在入门时遇到了一些困难。

我的问题是关于以我在 SQL 中的方式对一堆数据进行分组;根据我所做的研究,在我看来 linq.js 是要走的路,还是有其他好的选择?

我的数据如下:

    var data = [

        { ID: I1, Group: G1, Name: A, ArrivalDate: 42097, ReturnDate: 42098, Travellers: 22, City: Boston },
        { ID: I1, Group: G1, Name: A, ArrivalDate: 42098, ReturnDate: 42099, Travellers: 22, City: New York },
        { ID: I1, Group: G1, Name: A, ArrivalDate: 42099, ReturnDate: 42100, Travellers: 22, City: Chicage },
        { ID: I2, Group: G1, Name: A, ArrivalDate: 42097, ReturnDate: 42098, Travellers: 14, City: Boston },
        { ID: I2, Group: G1, Name: A, ArrivalDate: 42098, ReturnDate: 42099, Travellers: 14, City: New York },
        { ID: I2, Group: G1, Name: A, ArrivalDate: 42099, ReturnDate: 42100, Travellers: 14, City: Chicage },
        { ID: I3, Group: G2, Name: B, ArrivalDate: 42091, ReturnDate: 42092, Travellers: 21, City: Boston },
        { ID: I3, Group: G2, Name: B, ArrivalDate: 42092, ReturnDate: 42093, Travellers: 21, City: New York },
        { ID: I3, Group: G2, Name: B, ArrivalDate: 42093, ReturnDate: 42094, Travellers: 21, City: Chicage },
        { ID: I4, Group: G2, Name: B, ArrivalDate: 42091, ReturnDate: 42092, Travellers: 22, City: Boston },
        { ID: I4, Group: G2, Name: B, ArrivalDate: 42092, ReturnDate: 42093, Travellers: 22, City: New York },
        { ID: I4, Group: G2, Name: B, ArrivalDate: 42093, ReturnDate: 42094, Travellers: 22, City: Chicage },
        { ID: I5, Group: G3, Name: C, ArrivalDate: 42082, ReturnDate: 42083, Travellers: 30, City: Boston },
        { ID: I5, Group: G3, Name: C, ArrivalDate: 42083, ReturnDate: 42084, Travellers: 30, City: New York },
        { ID: I5, Group: G3, Name: C, ArrivalDate: 42084, ReturnDate: 42085, Travellers: 30, City: Chicage },
        { ID: I6, Group: G3, Name: C, ArrivalDate: 42082, ReturnDate: 42083, Travellers: 10, City: Boston },
        { ID: I6, Group: G3, Name: C, ArrivalDate: 42083, ReturnDate: 42084, Travellers: 10, City: New York },
        { ID: I6, Group: G3, Name: C, ArrivalDate: 42084, ReturnDate: 42085, Travellers: 10, City: Chicage }
    ]

在 SQL 中,我会执行以下操作:

Select  ID,
        Group,
        Name, 
        min(ArrivalDate) as ArrivalDate, 
        max(ReturnDate) as ReturnDate, 
        Travellers
    from data
    group by ID, Group, Name, Travellers

输出将是:

    [
        { ID: I1, Group: G1, Name: A, ArrivalDate: 42097, ReturnDate: 42100, Travellers: 22 }
        { ID: I2, Group: G1, Name: A, ArrivalDate: 42097, ReturnDate: 42100, Travellers: 14 }
        { ID: I3, Group: G2, Name: B, ArrivalDate: 42091, ReturnDate: 42094, Travellers: 21 }
        { ID: I4, Group: G2, Name: B, ArrivalDate: 42091, ReturnDate: 42094, Travellers: 22 }
        { ID: I5, Group: G3, Name: C, ArrivalDate: 42082, ReturnDate: 42085, Travellers: 30 }
        { ID: I6, Group: G3, Name: C, ArrivalDate: 42082, ReturnDate: 42085, Travellers: 10 }
    ]

直观地说,这就是我想用 linq.js 编写的内容:

    var datagroup = Enumerable.From(data)
            .GroupBy("$.id", null,
                     function (key, g) {
                         return {
                           id: key,
                           group: g("$.group"),
                           name: g("$.name"),
                           arrivaldate: g.min("$.arrivaldate"),
                           returndate: g.max("$.returndate"),
                           travellers: g("$.travellers")
                         }
            })
            .ToArray();

感谢您提供任何帮助,感谢您提供重要信息!

【问题讨论】:

标签: javascript linq.js


【解决方案1】:

您有一个复合键,因此您需要使用为键提供比较功能的重载。

var query = Enumerable.From(data)
    .GroupBy(
        // key composed of ID, Group, Name, and Travellers
        "{ ID: $.ID, Group: $.Group, Name: $.Name, Travellers: $.Travellers }",
        null,
        "{ ID: $.ID, Group: $.Group, Name: $.Name, ArrivalDate: $$.Min('$.ArrivalDate'), ReturnDate: $$.Max('$.ReturnDate'), Travellers: $.Travellers }",
        // compare keys using this string representation
        "[ $.ID, $.Group, $.Name, $.Travellers ].join('|')")
    .ToArray();

【讨论】:

  • 这很有道理,就像一个魅力。非常感谢杰夫!
猜你喜欢
  • 2014-07-05
  • 2021-08-29
  • 2012-10-07
  • 1970-01-01
  • 2023-01-08
  • 2014-12-18
  • 2020-10-22
  • 2016-09-14
  • 1970-01-01
相关资源
最近更新 更多