Javascript:使用for循环将数组推送到数组上
请给我解释一下。我正在尝试创建一个带有for循环的数组数组。当它不起作用时,我试图简化代码以了解Javascript在做什么,但简单的代码也没有意义Javascript:使用for循环将数组推送到数组上,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,请给我解释一下。我正在尝试创建一个带有for循环的数组数组。当它不起作用时,我试图简化代码以了解Javascript在做什么,但简单的代码也没有意义 function test(){ var sub_array = []; var super_array =[]; for (var i=1;i<=3;i++){ sub_array.push(i); super_array.push(sub_array); } aler
function test(){
var sub_array = [];
var super_array =[];
for (var i=1;i<=3;i++){
sub_array.push(i);
super_array.push(sub_array);
}
alert(super_array);
}
功能测试(){
var sub_数组=[];
var super_数组=[];
对于(var i=1;i当你推送“sub_数组”时,你没有推送它的副本。你在“super_数组”中得到同一数组三次。(我应该说,你推送同一数组的引用三次。)
您可以这样做:
// ...
super_array.push(sub_array.slice(0));
创建副本。它与您添加到超级数组的子数组相同。因此,它必须不同
您没有创建新数组并将其推入超级数组。您总是将对同一数组的引用推入超级数组
要解决此问题,可以在推送子阵列之前使用克隆子阵列:
function test() {
var sub_array = [];
var super_array = [];
for (var i = 1; i <= 3; i++) {
sub_array.push(i);
super_array.push(sub_array.slice(0));
}
alert(super_array);
}
sub\u数组
作为引用存储在super\u数组
中,这意味着当您更改sub\u数组
时,更改会反映在super\u数组中。请注意,对于for循环中的每次迭代,您都会将相同的数组推入super\u数组。请尝试以下操作:
function test(){
var sub_array = [];
var super_array =[];
for (var i=1;i<=3;i++){
sub_array = sub_array.slice(0,sub_array.length);
sub_array.push(i);
super_array.push(sub_array);
}
alert(super_array);
}
功能测试(){
var sub_数组=[];
var super_数组=[];
对于(var i=1;i很好。您必须了解,数组、对象、函数等都是javascript中的引用(只有数字(Int、float等)和字符串是“按值”传递的,这意味着值是复制/复制的)!
如果您有一个var a=[];
,并说var b=a
并添加b.push(“bla”)
,则警报a将向您显示“bla”条目,即使您已将其添加到b。
换句话说,a和b就像妈妈在冰箱上写的一张便条,上面写着“左边的沙子是给你的。”然后你知道,拿左边的那张,而不仅仅是冰箱里的任意三明治。她还可以写另一张便条(变量b)在你家的门上,这样你就知道如果你赶时间去哪里找三明治了。
如果她会在门上贴一个三明治……好吧,那就是阿克沃德。JS也这么认为:)
因此,你的问题的解决方案是休耕
function test(){
var super_array =[];
for (var i=1;i<=3;i++){
var subarray=[];
for (var u=1;u<=4-i;u++){
sub_array.push(u);
super_array.push(subarray);
}
}
alert(super_array);
}
功能测试(){
var super_数组=[];
对于(var i=1;我为什么选择使用.slice(0)
来复制数组,而不是.concat()
?这可能更快,但我所做的分析我不确定。有趣的是,根据concat()
的说法,速度更快。我会在回答中提到它。谢谢你的评论:)此解决方案使我免于头发撕裂。感谢+1使用slice,尽管在使用它克隆整个数组arr.slice()时不需要传入任何参数===arr.slice(0,arr.length)
function test(){
var super_array =[];
for (var i=1;i<=3;i++){
var subarray=[];
for (var u=1;u<=4-i;u++){
sub_array.push(u);
super_array.push(subarray);
}
}
alert(super_array);
}