繁体   English   中英

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还有一个优点,即迭代器函数包含特定于循环的变量( entryindex ),因此您不会污染您使用它的范围。 存在运行时开销,因为每个数组元素都有函数调用开销。 但是实际上函数调用非常快( 即使在IE6上也是狗),你可以确定你在循环体中做的其他任何事情都会完全消除额外的开销。

使用“较旧”版本的JavaScript(第3版),没有内置任何内容,您可以提供自己的功能,也可以在每个循环中声明数组的变量(以及索引变量和数组条目)变量),例如:

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只允许您获取密钥,因此必须使用该密钥来访问对数组的引用中的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM