在复杂阵列上分组依据

时间:2019-02-26 14:47:05

标签: javascript arrays group-by

我有一个像这样的数组:

scripts
    [
      ["scriptNameA", "dateAsString1", number],
      ["scriptNameB", "dateAsString1", number],
      ["scriptNameC", "dateAsString2", number],
      ["scriptNameD", "dateAsString3", number],
      ["scriptNameE", "dateAsString3", number]
    ]

我想得到一个按日期分组的数组

scriptsGroupedByDate[
    "dateAsString1"[
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number]
    ],
    "dateAsString2"[
        ["scriptNameC", "dateAsString2", number]
    ],
    "dateAsString3"[
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ]
]

有没有办法做到这一点? 谢谢

3 个答案:

答案 0 :(得分:2)

let number = 0;

let scripts =
    [
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number],
        ["scriptNameC", "dateAsString2", number],
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ];

var result = scripts.reduce((a, b) => (a[b[1]] ? a[b[1]].push(b) : a[b[1]] = [b], a), {});

console.log(result);

答案 1 :(得分:1)

使用reduce很容易

let number = 0;
let scripts = [
  ['scriptNameA', 'dateAsString1', number],
  ['scriptNameB', 'dateAsString1', number],
  ['scriptNameC', 'dateAsString2', number],
  ['scriptNameD', 'dateAsString3', number],
  ['scriptNameE', 'dateAsString3', number]
];

const res = scripts.reduce((a, b) => a.set(b[1], (a.get(b[1]) || []).concat(b)),new Map);
console.log(res) // open the console, SO's console output can't Map;

您可以轻松地将生成的Map转换为您喜欢的任何结构。

答案 2 :(得分:0)

@gkelly和其他人:Tnx提供了出色的答案。我花了一段时间来掌握所有这些语法。这是相同的答案,因此您可以逐步调试它,并查看其工作原理。很抱歉将其发布为答案,但是我不知道如何格式化注释中的代码。

let number = 0;
let scripts =
    [
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number],
        ["scriptNameC", "dateAsString2", number],
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ];


var func = function(accum, arrayitem) {
    debugger;

    //arrayitem is one of the five items in the scripts array. It is itself an array.
    //The 2nd item (zero based index) is the groupby value
    var groupByVal = arrayitem[1];

    //the accumulator is first an empty object (second parameter to reduce function)
    if(accum[groupByVal]){
        accum[groupByVal].push(arrayitem);
    }
    else {
        accum[groupByVal] = [arrayitem];
    }
    return accum;
};

var result = scripts.reduce(func, {});
console.log(result);