Javascript数组多维推送?

时间:2016-11-14 12:20:55

标签: javascript arrays matrix multidimensional-array push

我正在尝试将列转换为行:

 var  input = [
    ["aaa","111","zzz"],
    ["bbb","222","xxx"],
    ["ccc","333","yyy"]
    ];  

到此:

input = [
["aaa","bbb","ccc"],
["111","222","333"],
["zzz","xxx","yyy"],
];

这里我做了什么,为什么输出[j] .push(input [i] [j]); 没有工作?,输出[j]是我需要的......'j'正在循环? 我做了手册,它有效,我做了所有的研究,但我的大脑还不够好,所以任何人都能解释一下吗?我是一个新手。我需要有人找到我的错误,因为我一直在思考我的逻辑是否真实,但为什么它不起作用。它让我困惑,无法学习另一种方式。

function dataHandling(){

   var output = []; 

    for (var i=0; i < input.length  ; i++){ 
      output.push([]);
      //console.log(i)
      for (var j =0; j < input[i].length ; j++){
      output[j].push(input[i][j]);
 }

   }
 console.log(output);

}

 // console.log(len2);


     var input = [
["aaa","111","zzz"],
["bbb","222","xxx"],
["ccc","333","yyy"]
];

dataHandling(input);

编辑:这可以在不传递参数的情况下适用吗?并保持dataHandling()为空,但感谢你的回答,我试着去学习它。

编辑2:同时&gt;&gt;输出[I] .push(输入[J] [I]);给我答案,是的,但它是有效的 如果我改变不对称矩阵 如果我将输入更改为:

var input = [
                ["0001", "Roman Alamsyah", "Bandar Lampung", "21/05/1989", "Membaca"],
                ["0002", "Dika Sembiring", "Medan", "10/10/1992", "Bermain Gitar"],
                ["0003", "Winona", "Ambon", "25/12/1965", "Memasak"],
                ["0004", "Bintang Senjaya", "Martapura", "6/4/1970", "Berkebun"]
];

为什么它根本不起作用? jsbin中的错误。

4 个答案:

答案 0 :(得分:2)

您可以使用两个嵌套的Array#forEach lopps并将透视值分配给更改的索引。

var input = [["aaa", "111", "zzz"], ["bbb", "222", "xxx"], ["ccc", "333", "yyy"]],
    output=[];

input.forEach(function (a, j) {
    a.forEach(function (b, i) {
        output[i] = output[i] || [];
        output[i][j] = b;
    });
});

console.log(output);

答案 1 :(得分:2)

您可以使用map()执行此操作,只需返回input[c][i]

  1. c是内部数组中每个元素的索引,因此0,1,2
  2. i是当前内部数组的索引,所以在内部数组的元素的每次迭代中,它将是0然后是1等...
  3. var input = [
      ["aaa", "111", "zzz"],
      ["bbb", "222", "xxx"],
      ["ccc", "333", "yyy"]
    ];
    
    var result = input.map(function(arr, i) {
      return arr.map(function(e, c) {
        return input[c][i]
      })
    })
    
    console.log(result)

    如果你想使用两个for循环,你可以这样做。

    var input = [
      ["aaa", "111", "zzz"],
      ["bbb", "222", "xxx"],
      ["ccc", "333", "yyy"]
    ];
    
    var output = [];
    
    for (var i = 0; i < input.length; i++) {
      var ar = [];
      for (var j = 0; j < input[i].length; j++) {
        ar.push(input[j][i]);
      }
      output.push(ar)
    }
    
    console.log(output)

答案 2 :(得分:0)

修改了你的解决方案。请试试!!

  var input = [["aaa", "111", "zzz"],
                ["bbb", "222", "xxx"],
                ["ccc", "333", "yyy"]
    ];

    function dataHandling() {           
        var output = [];        

        for (var i = 0; i < input.length  ; i++) {                
            output[i] = [];                
            for (var j = 0; j < input[i].length ; j++) {                    
                output[i][j] = input[j][i];
            }
        }        
        console.log(output);
        return output;
    }

答案 3 :(得分:0)

虽然NinaNenad的解决方案是非常好的解决方案,但我想在您的算法中指出一个小问题:您的ouput[j].push()没有做您所做的事情期待。

因为j是子数组中的索引,所以您将尝试在其他不存在的东西中进行推送。 output将只包含一个元素,即您在循环开头推送的元素,但您会尝试将某些元素推送到output的所有3个元素。因此,您可以通过push()调用undefined,从而产生 Error (正好Uncaught TypeError: Cannot read property 'push' of undefined)。

我建议您以另一种方式执行此操作,而不是按此顺序推送元素,首先处理output的子数组,而不是input的子数组:

function dataHandling(input){
  var output = [];
  for (var i=0; i < input[0].length  ; i++){ 
    output.push([]);
    for (var j =0; j < input.length ; j++)
      output[i].push(input[j][i]);
  }
  console.log(output);
}



var input = [
    ["aaa","111","zzz"],
    ["bbb","222","xxx"],
    ["ccc","333","yyy"]
  ];

dataHandling(input);

实际上它看起来很像J-Mean回答,但稍微修复了两个for循环的索引。该函数假设所有子数组的长度相同。

编辑:

关于参数

实际上你不需要它,如果变量在范围内可用,但我不记得它是否在声明范围或执行范围内。无论如何,不​​将它作为参数传递是副作用,它可能导致奇怪的错误,所以我不鼓励你使用它。一开始,使用大量全局变量(读取:未作为参数传递的变量)真的很诱人,但尽可能避免使用它。

关于新输入

我修复了上面的代码,并对其进行了测试,失败了input[i].length,因为子数组比input长,所以只需将i替换为0 double pos;