【问题标题】:group data within a multidimensional javascript array在多维 javascript 数组中对数据进行分组
【发布时间】:2014-05-21 20:05:29
【问题描述】:

我有一个多维 javascript 数组,其中填充了很多冗余数据,我希望这些数据按自身内部的元素分组...

// current array
pGroup = ([pm, name]); // [0][0] = pm0, [0][1] = name0 ... [n][0] = pmn, [n][1] = namen

我的目标是过滤掉所有多余的 pm,然后将名称分组到一个数组中,附加到它们各自的名称上。

我尝试了几种失败的 $.grep、$.filter 组合,并稍微修改了 underscore.js 以找到解决方案。但到目前为止我还是一无所获。

任何解决方案的指导将不胜感激。

编辑:

// 当前数组

pGroup [

    [0]
    0: "Whimpenny, Walter"
    1: "105495-005_SMS M&S Option Year 1"
    ,

    [1]
    0: "Whimpenny, Walter"
    1: "105495-005_SMS M&S Option Year 2"
    , 

    [2]
    0: "Sukumar, Prasanna"
    1: "DISA-JCSS/Staff Aug-SO #203868" 

]

// 请求结果

pGroup [

    [0] 0: "Whimpenny, Walter" 1: ["105495-005_SMS M&S Option Year 1", "105495-005_SMS M&S Option Year 2"]

    [1] 0: "Sukumar, Prasanna" 1: ["DISA-JCSS/Staff Aug-SO #203868" ]

]

【问题讨论】:

  • 您能否给出输入的实际示例及其各自的输出?
  • 当然,我用示例编辑了帖子。

标签: javascript jquery arrays


【解决方案1】:

使用键控名称的对象对值进行分组。

var result_obj = {};
$.each(pGroup, function(i, e) {
    var name = e[0], val = e[1];
    if (result_obj[name]) {
        result_obj[name].push(val);
    } else {
        result_obj[name] = [val];
});

然后将它们收集回一个数组中。

pGroup = [];
$.each(result_obj, function(i, e) {
    pGroup.push([i, e]);
});

但是,我建议您不要对结果使用多维数组。数组应该用于统一、有序的集合。你的第二个维度不统一,应该是这样的对象:

$.each(result_obj, function(i, e) {
    pGroup.push({name: i, values: e});
});

【讨论】:

    【解决方案2】:

    这是一个使用 Lo-Dash 的功能性解决方案:

    var grouped = _.map(_.groupBy(pGroup, 0), function (el) {
        return [el[0][0], _.pluck(el, 1)];
    });
    

    JSBin


    或者,您可以将return 行更改为以下内容,以在最终产品中生成对象而不是数组,正如Barmar 所建议的那样:

    return { name: el[0][0], values: _.pluck(el, 1) };
    

    【讨论】:

    • 解决方案效果很好,尽管我看到了@Barmar 关于在数组上使用对象的观点。
    • @Tabaker78 是的,在这种情况下,对象可能是更好的选择。如果您选择走这条路,那么将这个解决方案转换为使用对象会很容易。
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多