Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在复杂数组上分组_Javascript_Arrays_Group By - Fatal编程技术网

Javascript 在复杂数组上分组

Javascript 在复杂数组上分组,javascript,arrays,group-by,Javascript,Arrays,Group By,我有一个这样的数组: scripts [ ["scriptNameA", "dateAsString1", number], ["scriptNameB", "dateAsString1", number], ["scriptNameC", "dateAsString2", number], ["scriptNameD", "dateAsString3", number], ["scriptNameE", "dateAsStri

我有一个这样的数组:

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]
    ]
]
有办法做到这一点吗? 谢谢

使用reduce很容易

let number=0;
让脚本=[
['scriptNameA','DateAsString',编号],
['scriptNameB','DateAsString',编号],
['scriptNameC','DateAsString',编号],
['scriptNameD','DateAsString',number],
['scriptNameE','dateAsString3',编号]
];
const res=scripts.reduce((a,b)=>a.set(b[1],(a.get(b[1])| |[]).concat(b)),新映射);
log(res)//打开控制台,因此的控制台输出无法映射
let number=0;
让脚本=
[
[“scriptNameA”,“dateAsString1”,编号],
[“scriptNameB”,“dateAsString1”,编号],
[“scriptNameC”,“dateAsString2”,编号],
[“scriptNameD”,“dateAsString3”,编号],
[“scriptNameE”,“dateAsString3”,编号]
];
var result=scripts.reduce((a,b)=>(a[b[1]]?a[b[1]]。push(b):a[b[1]]=[b],a),{});

控制台日志(结果)@gkelly和其他人:感谢这些伟大的答案。我有一段时间掌握了所有的语法。这是相同的答案,因此您可以一步一步地调试它,并查看它是如何工作的。很抱歉将其作为答案发布,但我不知道如何在注释中格式化代码

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

请添加有效的输出。你想要一个二维阵列吗?或者是一个对象,其键为
dateAsString1
等,值为分组数组?非常感谢,它工作得非常好,对我帮助很大!!请记住,这里的答案不一定是最好的。我自己也为此感到内疚。我试着想出一小段有效的代码,因为有时要看谁能先回答是一场竞赛。最后,它是有效的,但可读性不强。不管怎么说,不客气,但请重写它,使其可读。不过,有些答案非常详细,经过深思熟虑,我祝贺那些花时间把事情做好的人