Javascript:如何整合/转换多维数组

Javascript:如何整合/转换多维数组,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我需要在javascript中转换多维数组方面的帮助。 输入数组示例: [ [['a',1],['b',2],['c',3]], [['a',4],['d',2],['c',3],['x',5]], [['a',1],['c',2],['f',3],['x',1],['o',7]] ] 期望输出: [ ["a",1,4,1], ["b",2,null,null], ["c",3,3,2], ["d",null,2,null], ["x",null,5,1], ["f",null,null,3]

我需要在javascript中转换多维数组方面的帮助。 输入数组示例:

[
[['a',1],['b',2],['c',3]],
[['a',4],['d',2],['c',3],['x',5]],
[['a',1],['c',2],['f',3],['x',1],['o',7]]
]
期望输出:

[
["a",1,4,1],
["b",2,null,null],
["c",3,3,2],
["d",null,2,null],
["x",null,5,1],
["f",null,null,3],
["o",null,null,7]]
]
所以我需要在第一个元素上合并数组的一部分,并用“null”填充间隙。 e、 g.带“x”的pair在第二行和第三行中的值分别为5和1,因此应如下所示[“x”,null,5,1]。
只是为了解释数据,优化后的每条线都是一个图表数据系列,保持值的正确位置至关重要

到目前为止,我将数据合并到了预期的格式,但不知道如何在正确的位置添加“null”值

这是我的密码:

var cubes = [
        [['a',1],['b',2],['c',3]],
        [['a',4],['d',2],['c',3],['x',5]],
        [['a',1],['c',2],['f',3],['x',1],['o',7]]
        ];
var out = [];
for (var i=0; i<cubes.length; i++) {
    for (var j=0; j<cubes[i].length; j++) {
        out.push(cubes[i][j]);
        for (var x=0; x<out.length-1; x++) {
         if (out[x][0] == cubes[i][j][0]) {
            out[x].push(cubes[i][j][1]);
            out.pop();
         }
        }
    }
}
console.log(out);
此外,我“觉得”必须有更简单的方法来实现这一点,也许是使用map/reduce功能,但我的大脑今天被冻结了:/ 有什么建议吗


我会构建一个临时对象来按键存储数组,然后循环通过该对象来构建最终结果

var指数=0;
var结果=[];
var temp={};
变量立方=[
[a',1],[b',2],[c',3],
[a',4],[d',2],[c',3],[x',5],
[a',1],[c',2],[f',3],[x',1],[o',7]]
];
对于(变量i=0;i

您想要一种简单的方法,下面演示JavaScript最新的数组操作快捷方式:

var测试=[
[a',1],[b',2],[c',3],
[a',4],[d',2],[c',3],[x',5],
[a',1],[c',2],[f',3],[x',1],[o',7]]
];
var结果=[];
//此值将更新为最大可能值计数
var max_值=0;
//输入中的每一行
forEach(函数(行,索引){//index用于从右侧正确填充null
//每两个字母、数字
forEach(函数(单元格){//cell是['x',0]中的一个
var groupName=单元格[0];//a、b、c。。。
//在结果中查找组
var entry=result.find(函数(newRow){
返回newRow[0]==groupName;
});
//如果未找到组,请创建一个组并将其添加到结果中
如果(!输入){
条目=[groupName];
结果:推送(进入);
}
//左pad空值

而(entry.length-1以下要求对主键进行排序,因此最终结果的排序相同

[    
    [ "a", 1, 4, 1 ]
    [ "b", 2, null, null ]
    [ "c", 3, 3, 2 ]
    [ "d", null, 2, null ]
    [ "f", null, null, 3 ]
    [ "o", null, null, 7 ]
    [ "x", null, 5, 1 ]    
]
产生:


您的概念中已经存在一个逻辑缺陷。您需要明确知道最大偏移量,以便生成空填充:
null,null,7
。或者您需要执行两次运行算法,就像生成控制台输出时使用空格填充的算法一样。您必须执行两次通过逻辑。收集所有键,对它们进行排序,然后返回n填充数组中的键。这是以正确的顺序获得空值的唯一方法。哦,他不需要两次左填充。但右填充必须在第二次填充中添加。当然,我的解决方案是最快的,因为你也不需要任何临时对象…我想他希望结果的顺序与原始结果中显示的顺序相同inal数组,即
a、b、c、d、x、f、o
@dave很难说是什么决定了输出顺序。当不需要askedSorting时,OP从未回复,它只是减慢了过程。感谢您提供了使用“map”的极好示例.虽然我选择了Tomas的解决方案,但我也喜欢你的解决方案!排序是我以后想添加的,因此对我来说也是非常有效的解决方案。临时对象完全没有必要。@dave如果我写"下面是JavaScript最新的数组操作快捷方式的演示,为什么你希望它能在EI中工作?我特意用新技术编写了这篇文章来演示它们。但不用担心,如果我将它重写为
for
循环方法,它会更快,但可读性要差得多。顺便说一句,IE是,因此它在技术上不如我的方法有效功能。嗨,伙计们,哇-这里正在进行一些竞争!:)只是为了解释“排序”问题,按键排序确实很好,我认为这是一个额外的好处,因为我计划稍后添加它。我所说的保持值的正确位置实际上是让值按正确的顺序排列在行中。所有解决方案都实现了这一点。回到这个解决方案,我喜欢它有很好的注释。我需要看一下它在周末的时候,有评论,速度:)和了解Javascript中的“查找”对我来说是一个成功的解决方案。谢谢!@Markus btw,如果你想支持旧的浏览器。当然,polyfill会比原生函数慢一点。
var keys = [];
// sort cubes and create array of `keys`
cubes.forEach(function(cube){
    cube.sort(function(a,b){
       return a[0] > b[0] ;
    }).forEach(function(subArr){
        if(keys.indexOf(subArr[0]) ==-1 ){
            keys.push(subArr[0]);
        }
    });
});
// sort keys
keys.sort();
// map new array based on sorted cubes and sorted keys
var out = keys.map(function(key, idx){
    var newArr = [key];

    cubes.forEach(function(cube){
        var match = cube.filter(function(subArr){
            return subArr[0] === key;
        });
        newArr.push( match.length ? match[0][1] : null)
    });

    return newArr

});
[    
    [ "a", 1, 4, 1 ]
    [ "b", 2, null, null ]
    [ "c", 3, 3, 2 ]
    [ "d", null, 2, null ]
    [ "f", null, null, 3 ]
    [ "o", null, null, 7 ]
    [ "x", null, 5, 1 ]    
]