Javascript对派生数组进行迭代
Javascript iterate over derived array
我很震惊,我找不到答案(也许没有答案)。假设我想对一个数组进行一次迭代。我不需要创建一个变量来迭代,但这似乎是我必须做的。理想情况下,我可以做这样的事情:
for (key, val in 'one two three'.split(' ')) {
console.log(val);
}
但是,您似乎只能从javascript的for..in
语法中获得键。有没有任何方法可以迭代该数组而不首先将其存储到变量中?
大约一半的网络冲浪者(截至本文撰写之时,这个数字一直在上升)正在使用本机支持ECMAScript5的浏览器(例如,第5版),该浏览器对此有一些新的构造,包括forEach
:
"one two three".split(" ").forEach(function(val, key) {
// do stuff here
});
(或者,如果您不需要key
变量,请将其关闭[例如,...forEach(function(val) {...
]。)
即使浏览器没有,forEach
也是可以完全正确地"填充"(模拟)的功能之一,即使在较旧的浏览器中也是如此,例如通过es5_shim.js或类似功能。因此,只需包含垫片(或编写自己的垫片),并愉快地使用它,无论它是本地支持的还是您添加的内容。或者,您可能正在使用一个已经提供它的库或它的类似物(jQuery有$.each
,Prototype将each
添加到阵列中,Backbone提供类似的东西,等等)
forEach
还有一个优点,即迭代器函数包含特定于循环的变量(entry
和index
),因此不会污染使用它的范围。这会产生运行时开销,因为每个数组元素都有函数调用开销。但是函数调用实际上非常快(即使在IE6上,它也是一只狗),你可以确信,无论你在循环体中做什么,都会完全消除增加的开销。
对于"旧"版本的JavaScript(第三版),没有任何内置内容,您可以提供自己的函数来执行此操作,或者在每个循环中为数组声明一个变量(以及索引变量和数组入口变量),例如:
var array = "one two three".split(" ");
var key, val;
for (key = 0; key < array.length; ++key) {
val = array[key];
// do stuff here
}
但同样,您可以很容易地提供自己的forEach
。
另一个可以在旧引擎和新引擎中使用的构造是for..in
,它迭代对象的可枚举属性。不过,您最终仍然需要所有的变量。因为这不仅仅意味着"索引",你必须添加一些保护措施:
var array = "one two three".split(" ");
var key, val;
for (key in array) {
if (array.hasOwnProperty(key) && String(Number(key)) === key) {
// It's a numeric key and the object itself owns it
val = array[key];
// do stuff here
}
}
但在这种情况下,它不会给你买任何东西。当阵列稀疏时(例如,阵列中有大间隙),它很有用。
for/in
通常不用于数组,因为for
执行相同的基本任务,开销较小,不需要在循环块上使用健全性包装器。
也就是说,考虑到你所呈现的场景,不,在这种情况下没有办法获得价值。由于for/in
只允许您获取密钥,因此必须使用该密钥来访问数组引用中的值。
- 如何在DataTables 2.1中迭代对象数组
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 如何在Jquery中迭代JSON数组
- 为什么数组在对象内部迭代对象时存储重复值
- 迭代和修改Firebase数组会导致未定义
- 在对象上迭代以验证它是否's键存在于数组中
- 在JSON数组中进行迭代,并为其元素设置样式
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- JavaScript:如何在迭代过程中修改数组中的值
- 使用Ruby数组使用JS在视图中进行迭代和显示
- 使用javascript在数组中迭代和映射JSON
- 在数组中迭代时的JS循环位置
- 在可变长度d3的多维数组上迭代
- MVC:使用Web窗体视图引擎在javascript中迭代Viewbag数组
- 如何通过迭代对象数组来删除某些项目
- 如何在 JavaScript 中动态地编写可迭代的函数数组
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- 使用 promises/dedelay 异步迭代一组文件
- 不能让.offset()方法在迭代一组列表项时工作
- 迭代2个数组并找到匹配,但需要相同的索引