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
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)
已修改您的解决方案。请尝试一下!!
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()
,结果是 Error
(Uncaught 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
。
我正在尝试将列转换为行:
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
c
是内部数组中每个元素的索引,所以 0, 1, 2i
是当前内部数组的索引,因此在内部数组中元素的每次迭代中,它将是 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;
}
虽然 ouput[j].push()
没有达到您的预期。
因为j
是子数组里面的索引,你会尝试把不存在的东西压入其他东西里面。 output
将只包含一个元素,即您在循环开始时推送的那个元素,但您将尝试将某些内容推送到 output
的所有 3 个元素。因此,您将在 undefined
上调用 push()
,结果是 Error
(Uncaught 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
。