我有一个像这样的数组:
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]
]
]
有没有办法做到这一点? 谢谢
答案 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);