在for(each)循环中推入堆栈上的项并记录当前堆栈
Pushing items on stack and logging the current stack in a for(each) loop
我有以下问题,我似乎不能得到为什么它不工作的方式,我认为它应该工作:
function iterate(somelist){
anotherlist = [];
for(i = 0; i < somelist.length; i++){
anotherlist.push(somelist[i]);
console.log(anotherlist);
}
}
我希望它做的是记录一个不断增长的列表,但它只是打印完整的列表几次,好像它首先将所有变量推入另一个列表,然后启动日志函数。使用for或foreach循环似乎无关紧要。
我真的不明白为什么它是这样工作的,似乎也想不出一个方法来解决它。
提前感谢,
巴特
顺便说一下,在这种情况下,someelist是我迭代的对象,它似乎有所不同,因为我尝试了一个普通数组,这似乎是有效的。
您可能想要控制台记录新列表
console.log(anotherlist);
我怀疑控制台在更新之前等待线程完成,可能是为了不过多地干扰性能。当控制台UI最终更新时,线程(和循环)已经完成,所有日志引用相同的数组。
要解决这个问题,您可以调用数组的slice()
方法来在记录时复制数组:
function iterate(somelist){
anotherlist = [];
for(i = 0; i < somelist.length; i++){
anotherlist.push(somelist[i]);
console.log(anotherlist.slice());
}
}
var test = [1, 2, 3, 4];
iterate(test);
//-> [1]
//-> [1, 2]
//-> [1, 2, 3]
//-> [1, 2, 3, 4]
听起来你可能会对for(;;)和for(in)循环感到困惑。
For循环就是你从C, Java或基本上任何语言中知道的旧循环。创建一个循环变量,增加它,等等。
当然,你可能不能用for循环迭代对象,因为你需要有一个。length属性…
for(in)循环是而不是 foreach循环!(这种混淆是一个非常常见的Javascript陷阱)
for-in遍历对象属性,因此只能用于迭代对象,而不能用于数组。例如:
var xs = {
a : 1,
b : 2
};
for(var i in xs){
console.log(i, xs[i])
}
将打印
'a', 1
'b', 2
相关文章:
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- Rails File_field最大堆栈大小
- d3中堆栈函数和嵌套函数之间的差异
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- AngularJs对所有页面中的所有记录进行排序
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- window.location替换并传递URL历史记录条目中的变量
- Javascript历史记录转换为php行
- JavaScript,PHP-用JavaScript将多个数据库记录发送到变量或表
- 猫鼬在特定记录中查找嵌套记录
- 浏览器何时记录历史记录
- 将一个表的id与另一个表中的user_id进行匹配,以获取mysql中的记录
- 为什么我的JavaScript堆栈排序函数不起作用
- 更新成员数据模型中的记录列表
- 如何使用提交按钮搜索表中的记录
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 我们如何在javascript移动应用程序中记录骨干历史堆栈列表
- 清除历史记录堆栈.js
- 在for(each)循环中推入堆栈上的项并记录当前堆栈
- 在JavaScript中记录异常,捕获堆栈跟踪