Javascript数组多维推送?

Javascript Array multidimensional pushing?

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

 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:同时 >> output[i].push(input[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 错误。

您可以使用两个嵌套的 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);

您可以使用 map() 做到这一点,您只需要 return input[c][i] where

  1. c 是内部数组中每个元素的索引,所以 0, 1, 2
  2. i 是当前内部数组的索引,因此在内部数组中元素的每次迭代中,它将是 0 然后是 1 等等 ...

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)

已修改您的解决方案。请尝试一下!!

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

虽然 and 的解决方案是非常好的解决方案,但我想指出您算法中的一个小问题:您的 ouput[j].push() 没有达到您的预期。

因为j是子数组里面的索引,你会尝试把不存在的东西压入其他东西里面。 output 将只包含一个元素,即您在循环开始时推送的那个元素,但您将尝试将某些内容推送到 output 的所有 3 个元素。因此,您将在 undefined 上调用 push(),结果是 ErrorUncaught TypeError: Cannot read property 'push' of undefined)。

我建议您采用另一种方式,而不是按该顺序推送元素,您首先处理 output 的子数组,而不是 [=20= 的子数组]:

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

事实上,它看起来很像 答案,但对两个 for 循环的索引做了一些修正。该函数假定所有子数组的长度相同。

编辑:

关于参数

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

关于新输入

我修改了上面的代码,测试了一下,失败的是input[i].length,因为子数组比input长,所以直接替换i通过 0