我正在尝试将列转换为行:
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中的错误。
答案 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]
c
是内部数组中每个元素的索引,因此0,1,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)
答案 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)
虽然Nina和Nenad的解决方案是非常好的解决方案,但我想在您的算法中指出一个小问题:您的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;
。