Mar*_*ski 2940 javascript arrays loops for-loop
在Java中,您可以使用for
循环遍历数组中的对象,如下所示:
String[] myStringArray = {"Hello", "World"};
for (String s : myStringArray)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
你能用JavaScript做同样的事吗?
CMS*_*CMS 3683
使用顺序for
循环:
var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
console.log(myStringArray[i]);
//Do something
}
Run Code Online (Sandbox Code Playgroud)
@zipcodeman建议使用该break
语句,但是对于迭代数组continue
应该避免,该语句用于枚举对象属性.
它不应该用于类似数组的对象,因为:
第二点是它可以给你很多问题,例如,如果你扩展Array.prototype.forEach
对象以包含一个方法,那么该属性也将被枚举.
例如:
const array = ["one", "two", "three"]
array.forEach(function (item, index) {
console.log(item, index);
});
Run Code Online (Sandbox Code Playgroud)
上面的代码将控制"a","b","c"和"foo!".
如果你使用一些严重依赖原生原型增强的库(例如MooTools),这尤其成问题.
break
我前面说过的语句是枚举对象属性,例如:
array.forEach(item => console.log(item));
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,该continue
方法允许您仅枚举自己的属性,即它,只有对象物理上具有的属性,没有继承属性.
我建议你阅读以下文章:
Mar*_*eed 1084
是的,假设您的实现包括ECMAScript 2015中引入的for
... of
特性("Harmony"版本)......这些天是一个非常安全的假设.
它的工作原理如下:
// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
// ... do something with s ...
}
Run Code Online (Sandbox Code Playgroud)
或者更好的是,由于2015年的ECMAScript还通过提供块作用域的变量let
和const
:
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
// ... do something with s ...
}
// s is no longer defined here
Run Code Online (Sandbox Code Playgroud)
然而,一些JavaScript开发人员仍然在一个尚未出现的环境中工作 - 特别是如果编写代码在Web浏览器中运行,那么网站开发人员通常无法确定他们的客户将使用哪种浏览器/版本.
如果您可以假设JavaScript解释器符合以前版本的ECMAScript规范(例如,排除了9之前的Internet Explorer版本),那么您可以使用length
迭代器方法而不是循环.在这种情况下,您传递一个要在数组中的每个项目上调用的函数:
var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) {
// ... do something with s ...
} );
Run Code Online (Sandbox Code Playgroud)
但是,如果即使这样做太多了,并且您想要在所有版本的JavaScript 中都能运行的东西,那么您必须使用显式计数循环.最安全的版本,正确处理稀疏数组,如下所示:
var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
s = myStringArray[i];
// ... do something with s ...
}
Run Code Online (Sandbox Code Playgroud)
将长度值分配给局部变量(与length
在循环条件中包含完整表达式相反)可以在性能上产生显着差异,因为它每次都跳过属性查找; 在我的机器上使用Rhino,加速比为43%.
您将经常在循环初始化子句中看到完成的长度缓存,如下所示:
var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
if (i in myStringArray) {
s = myStringArray[i];
// ... do something with s ...
}
}
Run Code Online (Sandbox Code Playgroud)
其他人提到的undefined
... undefined
语法用于循环对象的属性; 因为JavaScript中的数组只是一个具有数字属性名称的对象(以及一个自动更新的for
属性),所以理论上可以用它循环一个数组.但问题是它并不局限于数值属性值(请记住,即使方法实际上只是其值为闭包的属性),也不会按数字顺序迭代它们.因此,of
... length
语法应该不会被用于通过数组循环.
has*_*sen 434
您可以使用map
,这是一种函数式编程技术,也可以在Python和Haskell等其他语言中使用.
[1,2,3,4].map( function(item) {
alert(item);
})
Run Code Online (Sandbox Code Playgroud)
一般语法是:
array.map(func)
Run Code Online (Sandbox Code Playgroud)
通常func
会采用一个参数,它是数组的一个项目.但是在JavaScript的情况下,它可以采用第二个参数,即项目的索引,以及第三个参数,即数组本身.
返回值array.map
是另一个数组,所以你可以像这样使用它:
var x = [1,2,3,4].map( function(item) {return item * 10;});
Run Code Online (Sandbox Code Playgroud)
现在x是[10,20,30,40]
.
您不必编写内联函数.它可能是一个单独的功能.
var item_processor = function(item) {
// Do something complicated to an item
}
new_list = my_list.map(item_processor);
Run Code Online (Sandbox Code Playgroud)
这将等同于:
for (item in my_list) {item_processor(item);}
Run Code Online (Sandbox Code Playgroud)
除非你没有得到new_list
.
seb*_*eli 116
在JavaScript中,不建议使用for-in循环遍历数组,但最好使用for循环,例如:
for(var i=0, len=myArray.length; i < len; i++){}
Run Code Online (Sandbox Code Playgroud)
它也被优化("缓存"数组长度).如果您想了解更多信息,请阅读我关于该主题的帖子.
Mar*_*des 107
(直接回答你的问题:现在你可以!)
大多数其他答案是正确的,但是他们没有提到(在撰写本文时)ECMA Script 6 2015带来了一种新的for..of
循环机制.
这种新语法是在javascript中迭代数组的最优雅方式(只要您不需要迭代索引),但浏览器尚未广泛支持它.
它目前适用于Firefox 13 +,Chrome 37+,它本身不能与其他浏览器一起使用(请参阅下面的浏览器兼容性).幸运的是,我们有JS编译器(例如Babel),它们允许我们今天使用下一代功能.
它也适用于Node(我在版本0.12.0上测试过它).
迭代一个数组
// You could also use "let" instead of "var" for block scope.
for (var letter of ["a", "b", "c"]) {
console.log(letter);
}
Run Code Online (Sandbox Code Playgroud)
迭代一个对象数组
var band = [
{firstName : 'John', lastName: 'Lennon'},
{firstName : 'Paul', lastName: 'McCartney'}
];
for(var member of band){
console.log(member.firstName + ' ' + member.lastName);
}
Run Code Online (Sandbox Code Playgroud)
迭代生成器:
(例子摘自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of)
function* fibonacci() { // a generator function
let [prev, curr] = [1, 1];
while (true) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
for (let n of fibonacci()) {
console.log(n);
// truncate the sequence at 1000
if (n >= 1000) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
兼容性表: http ://kangax.github.io/es5-compat-table/es6/#For..of循环
规格: http ://wiki.ecmascript.org/doku.php?id = ethmony : iterators
ken*_*bec 88
Opera,Safari,Firefox和Chrome现在共享一组增强的Array方法,用于优化许多常见循环.
您可能不需要所有这些,但它们可能非常有用,或者如果每个浏览器都支持它们.
Mozilla Labs发布了他们和WebKit都使用的算法,因此您可以自己添加它们.
filter返回满足某些条件或测试的项数组.
每如果每个阵列成员通过该测试返回true.
一些返回true,如果任何通过测试.
forEach在每个数组成员上运行一个函数,并且不返回任何内容.
map类似于forEach,但它返回每个元素的操作结果数组.
这些方法都为它们的第一个参数提供了一个函数,并且有一个可选的第二个参数,它是一个对象,当它们循环遍历函数时,它们要在数组成员上强加它们的作用域.
忽略它直到你需要它.
indexOf和lastIndexOf确切地找到与其参数匹配的第一个或最后一个元素的适当位置.
(function(){
var p, ap= Array.prototype, p2={
filter: function(fun, scope){
var L= this.length, A= [], i= 0, val;
if(typeof fun== 'function'){
while(i< L){
if(i in this){
val= this[i];
if(fun.call(scope, val, i, this)){
A[A.length]= val;
}
}
++i;
}
}
return A;
},
every: function(fun, scope){
var L= this.length, i= 0;
if(typeof fun== 'function'){
while(i<L){
if(i in this && !fun.call(scope, this[i], i, this))
return false;
++i;
}
return true;
}
return null;
},
forEach: function(fun, scope){
var L= this.length, i= 0;
if(typeof fun== 'function'){
while(i< L){
if(i in this){
fun.call(scope, this[i], i, this);
}
++i;
}
}
return this;
},
indexOf: function(what, i){
i= i || 0;
var L= this.length;
while(i< L){
if(this[i]=== what)
return i;
++i;
}
return -1;
},
lastIndexOf: function(what, i){
var L= this.length;
i= i || L-1;
if(isNaN(i) || i>= L)
i= L-1;
else
if(i< 0) i += L;
while(i> -1){
if(this[i]=== what)
return i;
--i;
}
return -1;
},
map: function(fun, scope){
var L= this.length, A= Array(this.length), i= 0, val;
if(typeof fun== 'function'){
while(i< L){
if(i in this){
A[i]= fun.call(scope, this[i], i, this);
}
++i;
}
return A;
}
},
some: function(fun, scope){
var i= 0, L= this.length;
if(typeof fun== 'function'){
while(i<L){
if(i in this && fun.call(scope, this[i], i, this))
return true;
++i;
}
return false;
}
}
}
for(p in p2){
if(!ap[p])
ap[p]= p2[p];
}
return true;
})();
Run Code Online (Sandbox Code Playgroud)
Tim*_*nen 64
使用while循环...
var i=0, item, items = ['one','two','three'];
while(item = items[i++]){
console.log(item);
}
Run Code Online (Sandbox Code Playgroud)
日志:'one','two','three'
而对于相反的顺序,一个更有效的循环
var items = ['one','two','three'], i = items.length;
while(i--){
console.log(items[i]);
}
Run Code Online (Sandbox Code Playgroud)
日志:'三','两个','一个'
或经典for
循环
var items = ['one','two','three']
for(var i=0, l = items.length; i < l; i++){
console.log(items[i]);
}
Run Code Online (Sandbox Code Playgroud)
日志:'one','two','three'
参考:http: //www.sitepoint.com/google-closure-how-not-to-write-javascript/
Joh*_*ers 57
从大学毕业后,我编写了Java,JavaScript,Pascal,ABAP,PHP,Progress 4GL,C/C++以及其他一些我现在想不到的语言.
虽然它们都有自己的语言特性,但每种语言都有许多相同的基本概念.这些概念包括过程/函数,IF
-statements,FOR
-loops和WHILE
-loops.
for
循环传统的for
循环有三个组成部分:
这三个组件通过;
符号彼此分开.这三个组件中的每个组件的内容都是可选的,这意味着以下是for
可能的最小循环:
for (;;) {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
当然,你需要在-loop中包含一个if(condition === true) { break; }
或某个if(condition === true) { return; }
地方for
以使其停止运行.
但是,通常,初始化用于声明索引,条件用于将该索引与最小值或最大值进行比较,并使用事后补充来增加索引:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
for
循环遍历数组循环遍历数组的传统方法是:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望向后循环,则执行以下操作:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
但是,有许多可能的变化,例如这一个:
for (var key = 0, value = myArray[key], length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
Run Code Online (Sandbox Code Playgroud)
......或者这一个......
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
Run Code Online (Sandbox Code Playgroud)
......或者这个:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
Run Code Online (Sandbox Code Playgroud)
无论哪种效果最好,主要取决于个人品味和您正在实施的具体用例.
请注意,所有浏览器都支持这些变体,包括非常旧的浏览器!
while
循环for
循环的一种替代方案是while
循环.要遍历数组,您可以这样做:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Run Code Online (Sandbox Code Playgroud)
与传统for
循环一样,while
即使是最古老的浏览器也支持循环.
另请注意,每个while循环都可以重写为for
循环.例如,while
上面的循环与此循环的行为完全相同for
:
for(var key = 0; value = myArray[key++];){
console.log(value);
}
Run Code Online (Sandbox Code Playgroud)
For...in
和 for...of
在JavaScript中,您也可以这样做:
for (i in myArray) {
console.log(myArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
但是,这应该谨慎使用,因为它for
在所有情况下都不像传统循环那样,并且存在需要考虑的潜在副作用.看看为什么在数组迭代中使用"for ... in"是一个坏主意?更多细节.
作为替代方案for...in
,现在也有for...of
.以下示例显示了for...of
循环和for...in
循环之间的区别:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Run Code Online (Sandbox Code Playgroud)
此外,您需要考虑没有Internet Explorer版本支持for...of
(Edge 12+支持),并且for...in
至少需要Internet Explorer 10.
Array.prototype.forEach()
for
-loops 的替代方法是Array.prototype.forEach()
,它使用以下语法:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
Array.prototype.forEach()
所有现代浏览器以及Internet Explorer 9及更高版本都支持.
最后,许多实用程序库也有自己的foreach
变体.AFAIK,三个最受欢迎的是这些:
$.each(myArray, function(key, value) {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
_.each(myArray, function(value, key, myArray) {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
_.forEach(myArray, function(value, key) {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
Phr*_*ogz 37
如果你想要一种简洁的方法来编写一个快速循环,你可以反向迭代:
for (var i=myArray.length;i--;){
var item=myArray[i];
}
Run Code Online (Sandbox Code Playgroud)
这样可以缓存长度(类似于for (var i=0, len=myArray.length; i<len; ++i)
和不同for (var i=0; i<myArray.length; ++i)
),同时输入的字符更少.
甚至有些时候你应该反向迭代,例如当迭代在一个实时NodeList上,你计划在迭代期间从DOM中删除项目.
Yuc*_*uci 33
一些用例在JavaScript 中以函数编程方式循环遍历数组:
const myArray = [{x:100}, {x:200}, {x:300}];
myArray.forEach((element, index, array) => {
console.log(element.x); // 100, 200, 300
console.log(index); // 0, 1, 2
console.log(array); // same myArray object 3 times
});
Run Code Online (Sandbox Code Playgroud)
注意:严格来说,Array.prototype.forEach()不是一种功能方式,因为它作为输入参数所采用的函数不应该返回一个值,因此不能将其视为纯函数.
const people = [
{name: 'John', age: 23},
{name: 'Andrew', age: 3},
{name: 'Peter', age: 8},
{name: 'Hanna', age: 14},
{name: 'Adam', age: 37}];
const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true
Run Code Online (Sandbox Code Playgroud)
const myArray = [{x:100}, {x:200}, {x:300}];
const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]
Run Code Online (Sandbox Code Playgroud)
注意:map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数.
const myArray = [{x:100}, {x:200}, {x:300}];
const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300
const average = sum / myArray.length;
console.log(average); // 200
Run Code Online (Sandbox Code Playgroud)
const myArray = [{x:100}, {x:200}, {x:300}];
const newArray= myArray.map(element => {
return {
...element,
x: element.x * 2
};
});
console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]
Run Code Online (Sandbox Code Playgroud)
const people = [
{name: 'John', group: 'A'},
{name: 'Andrew', group: 'C'},
{name: 'Peter', group: 'A'},
{name: 'James', group: 'B'},
{name: 'Hanna', group: 'A'},
{name: 'Adam', group: 'B'}];
const groupInfo = people.reduce((groups, person) => {
const {A = 0, B = 0, C = 0} = groups;
if (person.group === 'A') {
return {...groups, A: A + 1};
} else if (person.group === 'B') {
return {...groups, B: B + 1};
} else {
return {...groups, C: C + 1};
}
}, {});
console.log(groupInfo); // {A: 3, C: 1, B: 2}
Run Code Online (Sandbox Code Playgroud)
const myArray = [{x:100}, {x:200}, {x:300}];
const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}]
Run Code Online (Sandbox Code Playgroud)
注意:filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素.
const people = [
{ name: "John", age: 21 },
{ name: "Peter", age: 31 },
{ name: "Andrew", age: 29 },
{ name: "Thomas", age: 25 }
];
let sortByAge = people.sort(function (p1, p2) {
return p1.age - p2.age;
});
console.log(sortByAge);
Run Code Online (Sandbox Code Playgroud)
const people = [ {name: "john", age:23},
{name: "john", age:43},
{name: "jim", age:101},
{name: "bob", age:67} ];
const john = people.find(person => person.name === 'john');
console.log(john);
Run Code Online (Sandbox Code Playgroud)
Array.prototype.find()方法返回数组中第一个满足提供的测试函数的元素的值.
Gab*_*iel 28
有一种方法可以在循环中具有非常小的隐式范围并且消除额外的变量.
var i = 0,
item;
// note this is weak to sparse arrays or falsey values
for ( ; item = myStringArray[i++] ; ){
item; // This is the string at the index.
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的想获得id并拥有一个非常经典的for
循环:
var i = 0,
len = myStringArray.length; // cache the length
for ( ; i < len ; i++ ){
myStringArray[i]; // Don't use this if you plan on changing the length of the array
}
Run Code Online (Sandbox Code Playgroud)
现代浏览器都支持迭代方法forEach
,map
,reduce
,filter
和对其他方法主机数组原型.
Riz*_*N81 27
在JavaScript中有各种循环数组的方法.
通用循环:
var i;
for (i = 0; i < substr.length; ++i) {
// Do something with `substr[i]`
}
Run Code Online (Sandbox Code Playgroud)
ES5的forEach:
substr.forEach(function(item) {
// Do something with `item`
});
Run Code Online (Sandbox Code Playgroud)
jQuery.each:
jQuery.each(substr, function(index, item) {
// Do something with `item` (or `this` is also `item` if you like)
});
Run Code Online (Sandbox Code Playgroud)
看看这个详细信息,或者你也可以检查MDN在JavaScript中循环一个数组并使用jQuery检查每个jQuery.
And*_*son 26
我完全建议使用underscore.js库.它为您提供了各种可用于迭代数组/集合的函数.
例如:
_.each([1, 2, 3], function(num){ alert(num); });
=> alerts each number in turn...
Run Code Online (Sandbox Code Playgroud)
bzi*_*zim 26
数组循环:
for(var i = 0; i < things.length; i++){
var thing = things[i];
console.log(thing);
}
Run Code Online (Sandbox Code Playgroud)
对象循环:
for(var prop in obj){
var propValue = obj[prop];
console.log(propValue);
}
Run Code Online (Sandbox Code Playgroud)
Ali*_*eza 25
是的,您可以在JavaScript中使用循环执行相同的操作,但不限于此,在JavaScrip中执行循环数组的许多方法,假设您在下面有这个数组,并且您想对它进行循环:
var arr = [1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)
这些是解决方案:
1)For循环
for循环是在JavaScript中循环遍历数组的常用方法,但不被认为是大型数组的最快解决方案:
for (var i=0, l=arr.length; i<l; i++) {
console.log(arr[i]);
}
Run Code Online (Sandbox Code Playgroud)
2)while循环
虽然循环被认为是循环遍历长数组的最快方法,但通常在JavaScript中使用较少:
let i=0;
while (arr.length>i) {
console.log(arr[i]);
i++;
}
Run Code Online (Sandbox Code Playgroud)
3)做同时
做同样的事情,但有一些语法差异如下:
let i=0;
do {
console.log(arr[i]);
i++;
}
while (arr.length>i);
Run Code Online (Sandbox Code Playgroud)
这些是进行javascript循环的主要方法,但是还有更多的方法可以做到这一点.
我们还使用for
循环来循环javascript中的对象.
另外,也要看看do while
,while
,for in
等功能于JavaScript的数组.他们可能比使用map()
和更快更好地做事filter()
.
如果您想了解有关JavaScript中数组的异步函数的更多信息,这是一篇很好的文章.
如今,功能编程在开发领域引起了轰动.并且有充分的理由:功能技术可以帮助您编写更多的声明性代码,一目了然,重构和测试更容易理解.
函数式编程的基石之一是它对列表和列表操作的特殊使用.而那些东西正是它们的声音:事物的数组,以及你对它们所做的事情.但功能性思维方式对待它们的方式与您预期的有所不同.
本文将仔细研究我喜欢称之为"三大"列表的操作:map,filter和reduce.围绕这三个功能的思考是朝着能够编写干净的功能代码迈出的重要一步,并为功能和反应式编程的强大技术打开了大门.
这也意味着你永远不必再次编写for循环.
阅读更多>> 这里:
col*_*lxi 22
如果有人对可用于Array迭代的多种机制的性能方面感兴趣,我已经准备了以下JSPerf测试:
https://jsperf.com/fastest-array-iterator
传统的for()
迭代器是迄今为止最快的方法,特别是在与缓存的数组长度一起使用时.
let arr = [1,2,3,4,5];
for(let i=0, size=arr.length; i<size; i++){
// Do something
}
Run Code Online (Sandbox Code Playgroud)
该Array.prototype.forEach()
和Array.prototype.map()
方法是最慢的近似值,可能作为的结果,函数调用的开销
jus*_*don 20
如果您正在使用jQuery库,请考虑使用 http://api.jquery.com/jQuery.each/
从文档:
jQuery.each( collection, callback(indexInArray, valueOfElement) )
返回: 对象
描述: 通用迭代器函数,可用于无缝迭代对象和数组.具有length属性的数组和类似数组的对象(例如函数的参数对象)由数字索引迭代,从0到length-1.其他对象通过其命名属性进行迭代.
该
$.each()
函数与$(selector).each()
用于在jQuery对象上独占迭代的函数不同.该$.each()
函数可用于迭代任何集合,无论它是映射(JavaScript对象)还是数组.在数组的情况下,回调每次都传递一个数组索引和相应的数组值.(也可以通过this
关键字访问该值,但是Javascript将始终将this
值包装为Object
即使它是一个简单的字符串或数字值.)该方法返回其第一个参数,即迭代的对象.
Sti*_*itt 19
我还没有看到这种变化,我个人最喜欢这种变化:
给定一个数组:
var someArray = ["some", "example", "array"];
Run Code Online (Sandbox Code Playgroud)
您可以在不访问length属性的情况下遍历它:
for (var i=0, item; item=someArray[i]; i++) {
// item is "some", then "example", then "array"
// i is the index of item in the array
alert("someArray[" + i + "]: " + item);
}
Run Code Online (Sandbox Code Playgroud)
看到这个JsFiddle证明:http://jsfiddle.net/prvzk/
这仅适用于非稀疏的数组.这意味着数组中的每个索引实际上都有一个值.但是,我发现在实践中我几乎没有在Javascript中使用稀疏数组......在这种情况下,使用对象作为map/hashtable通常要容易得多.如果你有一个稀疏数组,并希望循环遍历0 .. length-1,你需要for(var i = 0; i <someArray.length; ++ i)构造,但是你仍需要一个if循环以检查当前索引处的元素是否实际定义.
此外,正如CMS在下面的注释中提到的那样,您只能在不包含任何伪造值的数组上使用它.示例中的字符串数组有效,但如果您有空字符串,或者数字为0或NaN等,则循环将过早中断.再次在实践中,这对我来说几乎不是问题,但是要记住这一点,这使得在使用它之前需要考虑这个循环...这可能会使某些人取消它的资格:)
我喜欢这个循环是:
这样做的原因是数组规范要求当你从索引> =数组的长度读取一个项目时,它将返回undefined.当您写入这样的位置时,它实际上会更新长度.
对我来说,这个构造最接近地模仿我喜欢的Java 5语法:
for (String item : someArray) {
}
Run Code Online (Sandbox Code Playgroud)
...还有了解循环内当前索引的额外好处
Kam*_*ski 19
深奥的可变方式
let a= ["Hello", "World"];
while(a.length) { console.log( a.shift() ); }
Run Code Online (Sandbox Code Playgroud)
kir*_*oid 16
有一种迭代自己的对象属性的方法,不包括原型的属性:
for (var i in array) if (array.hasOwnProperty(i)) {
// Do something with array[i]
}
Run Code Online (Sandbox Code Playgroud)
但它仍将迭代自定义属性.
在javascript中,任何自定义属性都可以分配给任何对象,包括数组.
如果想遍历数组疏林,for (var i = 0; i < array.length; i++) if (i in array)
或array.forEach
与es5shim
要使用.
mol*_*oco 15
var arr = [1, 2, 3, 1023, 1024];
for (var value; value = arr.pop();) {
value + 1
}
Run Code Online (Sandbox Code Playgroud)
http://jsperf.com/native-loop-performance/8
比较循环遍历100000个项目的数组的方法,并每次使用新值进行最小化操作.
制备:
<script src="//code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>
<script>
Benchmark.prototype.setup = function() {
// Fake function with minimal action on the value
var tmp = 0;
var process = function(value) {
tmp = value; // Hold a reference to the variable (prevent engine optimisation?)
};
// Declare the test Array
var arr = [];
for (var i = 0; i < 100000; i++)
arr[i] = i;
};
</script>
Run Code Online (Sandbox Code Playgroud)
测试:
<a href="http://jsperf.com/native-loop-performance/16"
title="http://jsperf.com/native-loop-performance/16"
><img src="http://i.imgur.com/YTrO68E.png" title="Hosted by imgur.com" /></a>
Run Code Online (Sandbox Code Playgroud)
Ale*_*tyi 15
数组迭代有4种方式:
// 1: for
for (let i = 0; i < arr.length; ++i) {
console.log(arr[i]);
}
// 2: forEach
arr.forEach((v, i) => console.log(v));
// 3: for in
for (let i in arr) {
console.log(arr[i]);
}
// 4: for of
for (const v of arr) {
console.log(v);
}
Run Code Online (Sandbox Code Playgroud)
摘要:1 和 3 解决方案创建额外的变量,2 - 创建额外的函数上下文。最好的方法是第四个 - "for of"。
Shu*_*tri 14
在JavaScript中有几种方法可以做到这一点.前两个示例是JavaScript示例.第三个使用JavaScript库,即jQuery使用该.each()
函数.
var myStringArray = ["hello", "World"];
for(var i in myStringArray) {
alert(myStringArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
var myStringArray = ["hello", "World"];
for (var i=0; i < myStringArray.length; i++) {
alert(myStringArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
var myStringArray = ["hello", "World"];
$.each(myStringArray, function(index, value){
alert(value);
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
Zah*_*med 11
优化的方法是缓存数组的长度,并使用单个var模式使用单个var关键字初始化所有变量.
var i, max, myStringArray = ["Hello","World"];
for (i = 0, max = myStringArray.length; i < max; i++) {
alert(myStringArray[i]);
//Do something
}
Run Code Online (Sandbox Code Playgroud)
如果迭代次序无关紧要,你应该尝试反向循环,它是最快的,因为它减少了开销条件测试和减少在一个语句中:
var i,myStringArray = ["item1","item2"];
for (i = myStringArray.length; i--) {
alert(myStringArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
循环使用时更好更清洁:
var myStringArray = ["item1","item2"],i = myStringArray.length;
while(i--) {
// do something with fruits[i]
}
Run Code Online (Sandbox Code Playgroud)
Alo*_*mon 11
在JavaScript中,循环数组有很多解决方案.
下面的代码很受欢迎
/** Declare inputs */
const items = ['Hello', 'World']
/** Solution 1. Simple for */
console.log('solution 1. simple for')
for (let i = 0; i < items.length; i++) {
console.log(items[i])
}
console.log()
console.log()
/** Solution 2. Simple while */
console.log('solution 2. simple while')
let i = 0
while (i < items.length) {
console.log(items[i++])
}
console.log()
console.log()
/** Solution 3. forEach*/
console.log('solution 3. forEach')
items.forEach(item => {
console.log(item)
})
console.log()
console.log()
/** Solution 4. for-of*/
console.log('solution 4. for-of')
for (const item of items) {
console.log(item)
}
console.log()
console.log()
Run Code Online (Sandbox Code Playgroud)
Esp*_*pen 11
我认为最好的方法是使用Array.forEach函数.如果您不能使用我建议从MDN获取polyfill使我可用,它肯定是在JavaScript中迭代数组的最安全的方法.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
正如其他人所说,这几乎总是你想要的:
var numbers = [1,11,22,33,44,55,66,77,88,99,111];
var sum = 0;
numbers.forEach(function(n){
sum += n;
});
Run Code Online (Sandbox Code Playgroud)
这可以确保您在处理数组范围内所需的任何内容都保留在该范围内,并且您只处理数组的值,而不是对象属性和其他成员,这就是.. in.
在大多数情况下,使用常规c样式for循环工作,重要的是要记住循环中的所有内容与程序的其余部分共享它的范围,{}不会创建新范围.
因此:
var sum = 0;
var numbers = [1,11,22,33,44,55,66,77,88,99,111];
for(var i = 0; i<numbers.length; ++i){
sum += numbers[i];
}
alert(i);
Run Code Online (Sandbox Code Playgroud)
将输出"11" - 这可能是也可能不是你想要的.
工作jsFiddle示例:https://jsfiddle.net/workingClassHacker/pxpv2dh5/7/
jj_*_*jj_ 10
如果你想使用jQuery,它的文档中有一个很好的例子:
$.each([ 52, 97 ], function( index, value ) {
alert( index + ": " + value );
});
Run Code Online (Sandbox Code Playgroud)
Sap*_*ick 10
正式的(也许是旧的)方式是Array.prototype.forEach(...)
:
var arr = ["apple", "banana", "cherry", "mango"];
arr.forEach(function(item, index, _) {
console.log("[" + index + "] = '" + item + "'");
});
Run Code Online (Sandbox Code Playgroud)
Sat*_*pta 10
您可以通过许多不同的方法循环遍历数组。我已经从上到下排序了我最喜欢的 6 种方法。
当只是简单地循环遍历数组时,for
循环是我的首选。
let array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
}
Run Code Online (Sandbox Code Playgroud)
forEach
loop 是一种循环遍历数组的现代方法。此外,它提供了更多的灵活性和对数组和元素的控制。
let array = [1, 2, 3, 4, 5];
array.forEach((element) => {
console.log(element);
});
Run Code Online (Sandbox Code Playgroud)
for...of
循环使您可以直接访问数组元素。
let array = [1, 2, 3, 4, 5];
for (let element of array) {
console.log(element);
}
Run Code Online (Sandbox Code Playgroud)
for...in
为您提供一个可以访问数组元素的键。
let array = [1, 2, 3, 4, 5];
for(let index in array){
console.log(array[index]);
}
Run Code Online (Sandbox Code Playgroud)
while 循环也可用于遍历数组。
let array = [1, 2, 3, 4, 5];
let length = array.length;
while(length > 0){
console.log(array[array.length - length]);
length--;
}
Run Code Online (Sandbox Code Playgroud)
同样,我使用do...while
循环
let array = [1, 2, 3, 4, 5];
let length = array.length;
do {
console.log(array[array.length - length]);
length--;
}
while (length > 0)
Run Code Online (Sandbox Code Playgroud)
它不是100%相同,但相似:
var myStringArray = ['Hello', 'World']; // array uses [] not {}
for (var i in myStringArray) {
console.log(i + ' -> ' + myStringArray[i]); // i is the index/key, not the item
}
Run Code Online (Sandbox Code Playgroud)
小智 9
//Make array
var array = ["1","2","3","4","5","6","7","8","9","10"]
//Loop
for(var i = 0; i < array.length; i++){
console.log((i+1) + " --> " + array[i])
}
Run Code Online (Sandbox Code Playgroud)
对于 的 ACTUAL 编号i
,如果需要,您需要更改(i+1)
为i
或(i)
。
希望这有帮助。
var x = [4, 5, 6];
for (i = 0, j = x[i]; i < x.length; j = x[++i]) {
console.log(i,j);
}
Run Code Online (Sandbox Code Playgroud)
很清洁......
小智 8
例如,我在Firefox控制台中使用:
[].forEach.call(document.getElementsByTagName('pre'), function(e){
console.log(e);
})
Run Code Online (Sandbox Code Playgroud)
简短回答:是的.你可以这样做:
var myArray = ["element1", "element2", "element3", "element4"];
for (i = 0; i < myArray.length; i++) {
console.log(myArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
在浏览器控制台中,您可以看到打印的"element1","element2"等内容.
在 javascript 中有多种方法可以做到这一点。以下是处理数组的常见方法。
方法一:
const students = ["Arun","Jos","John","Kiran"]
for (var index = 0; index < students.length; index++) {
console.log(students[index]);
}
Run Code Online (Sandbox Code Playgroud)
方法二:
students.forEach((student, index) => console.log(student));
方法三:
for (const student of students) {
console.log(student);
}
Run Code Online (Sandbox Code Playgroud)
当然它效率低下而且很多人鄙视它,但它是最接近上述之一的:
var myStringArray = ["Hello","World"];
myStringArray.forEach(function(f){
// Do something
})
Run Code Online (Sandbox Code Playgroud)
var myStringArray = ["hello", "World"];
myStringArray.forEach(function(val, index){
console.log(val, index);
})
Run Code Online (Sandbox Code Playgroud)
看来,列出的所有变种除了forEach
通过lodash:
_.forEach([1, 2], (value) => {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
只是一个简单的一线解决方案
arr = ["table", "chair"];
// Solution
arr.map((e) => {
console.log(e);
return e;
});
Run Code Online (Sandbox Code Playgroud)
那么,这个怎么样:
for (var key in myStringArray) {
console.log(myStringArray[key]);
}
Run Code Online (Sandbox Code Playgroud)
var obj = ["one","two","three"];
for(x in obj){
console.log(obj[x]);
}
Run Code Online (Sandbox Code Playgroud)
在数组上进行迭代时,我们经常要实现以下目标之一:
map()
for..of
,forEach()
或常规for
环const arr1 = [1, 2, 3];
const arr2 = arr1.map(el => el * 2);
// With map, we create a new arr2, and arr1 is left untouched
console.log(arr2, arr1);
// Regular 'for' loop
for (let i = 0; i < arr1.length; i++) {
console.log(arr1[i]);
}
console.log('\n');
// 'for' of loop
for (let el of arr1) {
console.log(el);
}
console.log('\n');
// forEach()
arr1.forEach(el => {
console.log(el)
})
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,它并不重要。但是,在某些极端情况下,一种迭代类型可能更适合您的需求:
map()
用于迭代。当您不需要返回新数组时,请不要使用map()
。map()
在所有循环方法中性能最慢。当性能发挥作用时,当您需要大量迭代时,定期for
循环:
for(let i=0; i < arr.length; i++) {}
Run Code Online (Sandbox Code Playgroud)
常常(由于JavaScript引擎的不同而有所不同)具有最佳性能,因为它是最“低级”的迭代形式。
Given an array, you can traverse it one of the many ways as follows.
1. Classic for
loop
const myArray = ['Hello', 'World'];
for (let i = 0; i < myArray.length; i++) {
console.log(myArray[i]);
}
Run Code Online (Sandbox Code Playgroud)
2. for...of
const myArray = ['Hello', 'World'];
for (const item of myArray) {
console.log(item);
}
Run Code Online (Sandbox Code Playgroud)
const myArray = ['Hello', 'World'];
myArray.forEach(item => {
console.log(item);
});
Run Code Online (Sandbox Code Playgroud)
4. while
loop
const myArray = ['Hello', 'World'];
let i = 0;
while (i < myArray.length) {
console.log(myArray[i]);
i++;
}
Run Code Online (Sandbox Code Playgroud)
5. do...while
loop
const myArray = ['Hello', 'World'];
let i = 0;
do {
console.log(myArray[i]);
i++;
} while (i < myArray.length);
Run Code Online (Sandbox Code Playgroud)
6. Queue style
const myArray = ['Hello', 'World'];
while (myArray.length) {
console.log(myArray.shift());
}
Run Code Online (Sandbox Code Playgroud)
7. Stack style
Note: The list is printed reverse in this one.
const myArray = ['Hello', 'World'];
while (myArray.length) {
console.log(myArray.pop());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3529659 次 |
最近记录: |