作为我正在谈论的例子,请参阅this MDN article,其中包含以下示例:
var evens = [i for each (i in range(0,21)) if (i % 2 == 0)];
我的问题是:
用什么名字来描述这种语法?我主要想知道这一点,所以我可以把谷歌和更多的阅读.我已经尝试了谷歌最好的我可以想出来,但没有能够把正确的术语在一起,以获得有用的结果.
这个语法是否存在于数组解析之外的其他地方?我觉得我已经看到在数组之外使用的其他例子(例如上面的例子),但我不确定.
在哪里可以阅读有关此语法的更多信息?
除Firefox之外,其他任何浏览器都支持这种浏览器?
这是ES5中的这个功能还是计划用于ES和谐?
解决方法
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
然而,正如几乎每一个和谐的“功能”,我不认为有没有真正的概念是否将真正包括在最终版本.您可以在Firefox中使用它作为“JavaScript 1.7”的一部分(真正仅适用于基于Mozilla的东西的模糊的“标准”规范);但是,您最好避免使用特定于FF的语法,特别是在其他浏览器中会导致语法错误.
您可以通过Google搜索“Array Comprehensions”来阅读更多信息,但正如我所提到的,由于它具有Mozilla特有的性质,因此它不是一个非常有用的工具.
您可以使用ES5中引入的reduce()Array方法实现类似的效果,而不需要更多的代码:
//JavaScript has no "range" function,so let's make one var range = function (begin,length) { var i,ret = []; for (i = begin; i < begin + length; i++) { ret.push(i); } return ret; }; var evens = range(0,21).reduce(function (arr,cur) { if (cur % 2 === 0) arr.push(cur); return arr; },[]);
与您正在寻找的内容相比,这可能有点冗长(甚至记住我们必须创建一个range()函数).但它是一个相对紧凑的解决方案,不需要大量的“设置”,主要解决问题:从一个数组过滤元素以形成第二个数组.
我能够把它减少到一个单行,但是变得有点不健康,所以我决定建议两行版本.如果你对一线感兴趣,这里是:
//Don't forget to define "range()" var evens = range(0,cur) { return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; },[]);
再次,这是ES5代码.如果您希望它在旧版浏览器中工作,那么您需要提供一个垫片来为Array.reduce()提供支持. MDN有一个:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
更新:
看起来我应该使用filter()而不是reduce().使代码更清洁.感谢OP建议!
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
再次,filter()是ES5,所以你需要一个垫片,以确保它在旧的浏览器上正常工作.