JavaScript:通过数字索引循环遍历对象而不是键值

3

虽然使用for(key in object)循环遍历对象很简单,但我想通过索引(类似于数组)而不是值来访问对象。

我有一个由“一周中的日子”组成的对象:

days: { sunday: "N", monday: "Y", tuesday: "N", wednesday: "Y", 
thursday: "N", friday: "Y", saturday: "N" }

我想使用一个for循环,循环七天(0-6),并检查该对象在该天是否为“Y”或“N”(通过检查days对象对应的值,例如星期天为键值0,星期一为1,以此类推)。
for (var i = 0; i < 7; i++) { }

我的问题可以通过一堆if语句解决,像这样:if i == 0 { //检查星期天 } else if i == 1 { //检查星期一 }或将我的对象转换为多个数组然后进行操作,但这两种方法都不够优雅。有没有一种方法可以循环遍历days对象,并通过键(第一个为0,第二个为1等)访问每个值?

1
无法保证顺序。您可以使用Object.keys(daysObject)将所有日期属性收集到数组中,然后可以对其进行迭代。再次强调,无法保证顺序。 - Rajaprabhu Aravindasamy
2
Javascript对象是映射,根据定义,它们不是索引的。 - Jim Cote
关于键的数组怎么样? - Nina Scholz
@NinaScholz,这是我目前正在使用的。我不确定是否有一种优雅的方法来实现我所描述的功能,希望仍然存在 - 但现在,我将把它转换为一个数组。 - T. Tenner
2个回答

1

你可以使用 Map - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

const days = { sunday: "N", monday: "Y", tuesday: "N", wednesday: "Y", 
thursday: "N", friday: "Y", saturday: "N" }

const map = new Map(Object.entries(days));
var mapIter = map.entries();

x = 0;
while(x < Object.keys(days).length) {
  let next = mapIter.next().value
  if(next[1] == 'Y') {
    console.log(next[0] + " is Y");
  }
  else if(next[1] == 'N') {
    console.log(next[0] + " is N");
  }
  x++;
}


Object.entries(days)不保证顺序: "Object.entries()方法返回一个给定对象自己可枚举属性的 [键,值] 数组,其顺序与 for...in 循环提供的顺序相同(区别在于 for...in 循环还会枚举原型链中的属性)" - Arjan
看起来对我来说它保持了顺序...看看代码片段。 - ewizard
1
一个代码片段并不能证明它,抱歉。在JavaScript中,for...in的顺序未被确定,尽管许多浏览器保留了顺序:_"for...in循环以任意顺序迭代对象的属性"_。 - Arjan

1
要按照一致的顺序遍历对象的属性,你只能使用一个属性名称的数组,例如:
var daysList = [ 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' ];

然后你可以遍历名称数组:
for (let i = 0; i < daysList.length; i++) {
    let day = daysList[i];
    // do what you need with days[day]
}

看起来确实没有办法以我所期望的方式做到我想要的事情。 - T. Tenner
不太像这样优雅...但另一种方法是使用 Map - ewizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接