【问题标题】:Javascript Array multidimensional pushing? [duplicate]Javascript Array多维推送? [复制]
【发布时间】:2017-03-28 02:02:54
【问题描述】:

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

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

到这个:

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

这里我做了什么,为什么 output[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中的错误。

【问题讨论】:

  • 这被称为转置矩阵顺便说一句。

标签: javascript arrays matrix multidimensional-array push


【解决方案1】:

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

因为j是子数组里面的索引,所以你会尝试往其他不存在的东西里推东西。 output 将只包含一个元素,即您在循环开始时推送的那个,但您会尝试将某些内容推送到 output 的所有 3 个元素。所以你会在undefined 上调用push(),结果是一个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

【讨论】:

  • 如果输出.push([]);在子数组中,然后 output[j] 将正常工作。但我仍然很难理解这一切......“你会尝试在其他不存在的事物中推动事物。”因为在我看来 J 在子数组中是向上计数的
  • 不适用于非对称矩阵?
  • 它会起作用,但前提是它是一个真正的矩阵,JavaScript 不会强制执行。只需在纸上迭代您的循环,您就会看到在第二个 for 循环中,您将执行 ouput[0].push(..)ouput[1].push(..)ouput[2].push(..),而 output 只会采用以下形式:@ 987654346@。 output 在索引 1 和 2 中不会有任何内容。这是因为 j 迭代子数组,而不是已经存在但不完整的 output
  • 但我认为,虽然了解我的修复方法很重要,但 IMO 的 NinaNenad 的解决方案要好得多。
  • 谢谢先生,是的,它们更好,但不是我现在想要的 :),我还是新手,看起来很有挑战性。
【解决方案2】:

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

  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】:

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

    【讨论】:

      【解决方案4】:

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

      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)

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 2015-08-24
        • 1970-01-01
        • 2013-07-19
        • 2011-06-04
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        相关资源
        最近更新 更多