我如何通过一个序列中的所有输入,使用JavaScript?
当前回答
for (var i = array.length; i--; ) {
// process array[i]
}
一般来说,对于更高的级别代码,其中清晰度和安全性是更大的担忧,我以前建议使用 Array::forEach 作为您的默认模式的旋转(尽管这些日子我更喜欢使用 for..of)。
for (var i = 0; i < array.length; i++) { ... } // Forwards
for (var i = array.length; i--; ) { ... } // Reverse
你会注意到,i--是中间条款(通常我们看到比较),最后条款是空的(通常我们看到i++)。这意味着i--也被用作继续的条件。
如何可以从 array.length 开始而不爆炸? 因为 i-- 运行在每个 iteration 之前,在第一个 iteration 我们将实际上访问项目在 array.length - 1 避免任何问题与 Array-out-of-bounds 未定义的项目. 为什么它不会停止 iterating 之前指数 0? 旋转将停止 iterating 当条件 i-- 评估到虚假值(当它产生 0)。
for (var i = array.length; i --> 0 ;) {
信用去了WYL,向我展示了对旋转的好处和恐惧。
其他回答
可能為(i = 0; i < array.length; i++) loop 不是最好的選擇. 為什麼? 如果你有這個:
var array = new Array();
array[1] = "Hello";
array[7] = "World";
array[11] = "!";
方法将从序列(0)到序列(2). 首先,这将是你甚至没有的参考变量,第二,你不会有序列中的变量,第三,这将使代码泡沫。
for(var i in array){
var el = array[i];
//If you want 'i' to be INT just put parseInt(i)
//Do something with el
}
如果你想要它成为一个功能,你可以这样做:
function foreach(array, call){
for(var i in array){
call(array[i]);
}
}
如果你想打破,更有逻辑:
function foreach(array, call){
for(var i in array){
if(call(array[i]) == false){
break;
}
}
}
例子:
foreach(array, function(el){
if(el != "!"){
console.log(el);
} else {
console.log(el+"!!");
}
});
它回来了:
//Hello
//World
//!!!
Iterators 提高效率,让您同时消耗列表中的物品,就好像它们是流。 使 iterator 特别的是它通过收藏的方式. 其他插槽需要将整个收藏上传到前面,以便在收藏中进行 iterate,而 iterator 只需要知道收藏中的当前位置。
您可以通过呼叫 iterator 的下一个方法访问当前项目,下一个方法将返回当前项目的值,并将一个 boolean 指示您到达收藏结束时。
您也可以使用 Symbol.iterator 将您的常规序列转换为 iterator 如下:
您也可以将您的常规序列转换为这样的 iterator:
注意事项:
对象不默认可用,在这种情况下使用为..in,因为而不是值,它用钥匙工作。
注意: 这个答案是毫无希望的日期。 为了更现代化的方法,请参见在序列上可用的方法。
forEach 地图过滤器 ZIP 减少每一个
在JavaScript中引用一个序列的标准方式是Vanilla for-loop:
var length = arr.length,
element = null;
for (var i = 0; i < length; i++) {
element = arr[i];
// Do something with element
}
但是,请注意,这种方法只有在你有一个密集的序列,每个指数都被一个元素占据。 如果序列是分散的,那么你可以运行到性能问题与这个方法,因为你会 iterate上很多指标,实际上不存在在序列。 在这种情况下,一个为.. in-loop 可能是一个更好的想法。
在 ECMAScript 5 将有一个 forEach 方法在序列的原型,但它不支持在遗产浏览器. 因此,能够连续使用它,你必须有一个环境支持它(例如,Node.js 服务器侧 JavaScript),或使用一个“Polyfill”。 该功能的 Polyfill 是,然而,三角形,因为它使代码更容易阅读,它是一个好 polyfill。
一个 forEach 实施(见 jsFiddle):
function forEach(list,callback) {
var length = list.length;
for (var n = 0; n < length; n++) {
callback.call(list[n]);
}
}
var myArray = ['hello','world'];
forEach(
myArray,
function(){
alert(this); // do something
}
);
关于ECMAScript6:
列表 = [0, 1, 2, 3] for (let obj of list) { console.log(obj) }
在哪里避免与内相关的异常,使它像任何其他语言的旋转一样工作,并让它在旋转中相反地连接到函数内。
手臂({})可以被忽略,如果只有一个命令(例如,在上面的例子)。