在多维javascript数组中分组数据

时间:2014-05-21 20:05:29

标签: javascript jquery arrays

我有一个多维javascript数组,里面充满了很多冗余数据,我希望这些数据按照自身内部的元素组合在一起......

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

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

我已经尝试了几个失败的$ .grep,$ .filter组合,并且使用了underscore.js修改了一些解决方案......但是到目前为止,我已经空了。< / p>

非常感谢对解决方案的任何指导。

编辑:

//当前数组

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" ]

]

2 个答案:

答案 0 :(得分:3)

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

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});
});

答案 1 :(得分: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) };