Javascript对派生数组进行迭代

Javascript iterate over derived array

本文关键字:迭代 数组 派生 Javascript      更新时间:2023-09-26

我很震惊,我找不到答案(也许没有答案)。假设我想对一个数组进行一次迭代。我不需要创建一个变量来迭代,但这似乎是我必须做的。理想情况下,我可以做这样的事情:

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还有一个优点,即迭代器函数包含特定于循环的变量(entryindex),因此不会污染使用它的范围。这会产生运行时开销,因为每个数组元素都有函数调用开销。但是函数调用实际上非常快(即使在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只允许您获取密钥,因此必须使用该密钥来访问数组引用中的值。