繁体   English   中英

在JavaScript中表现异常的循环

[英]for in loop behaving strangely in javascript

var friends=['2','3'];
console.log(friends);
var rooms=[];
for(var friend in friends){
var room = 'userid'+friend+'friends';
console.log(room);
rooms.push(room);
}
console.log(rooms);    

这个输出

[ '2', '3' ]
 userid0friends
 userid1friends
 [ 'userid0friends', 'userid1friends' ]

3被完全忽略了,它在我的node.js服务器上的表现甚至更奇怪

这里的friend是数组的索引,而不是索引的值

var room = 'userid'+friends[friend]+'friends';

另外,当我不建议在数组中循环使用..in循环时,可以使用Array.prototype.map或plain for循环来使用数组的长度

数组映射示例:

var friends=['2','3'];
console.log(friends);
var rooms= friends.map(function (friend, index) {
    return 'userid' + friend + 'friends';
});
console.log(rooms);

普通for循环:

var friends=['2','3'];
console.log(friends);
var rooms=[];
for (var i = 0, l = friends.length; i < l; ++i) {
    var room = 'userid' + friends[i] + 'friends';
    console.log(room);
    rooms.push(room);
}
console.log(rooms);

for in结构用于循环对象, for key in objectkeyfor key in object的属性名,当用于数组时, key将是数组索引。

您可以使用.map获得结果:

var friends=['2','3'];

var rooms = friends.map(function(e) {
  return 'userid'+e+'friends';
});

for in循环用于枚举对象。 您正在尝试遍历数组。 更好的迭代技术是常规的for循环或Array.forEach()方法。

在for in循环中,变量包含键,而不是值。 要获取值,请使用键:

for(var i in friends){
    var friend = friends[i];
    ...
}

但是,这再次枚举了一个对象,包括除数组元素之外的所有属性。 这意味着,如果任何代码向Array.prototype添加了一个方法,则该方法也将被枚举。 使用.forEach()更好:

friends.forEach(function (friend, i) {
    ...
});

更好的是,由于您尝试基于另一个对象的内容创建一个新的Array,请使用Array.map() 那正是它的目的。

var rooms = friends.map(function (friend, i) {
    return 'userid'+friend+'friends';
});

暂无
暂无

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

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