【问题标题】:Looping over a some hard coded data循环一些硬编码的数据
【发布时间】:2014-10-23 12:47:05
【问题描述】:

在几个地方,我对一组预定义的值进行了循环。

我当前的代码是:

for (var period in {'today':true,'yesterday':true,'this week':true,'last week':true,'this month':true,'last month':true}) {
  ...    
}

它有效,但是有没有更漂亮的方法呢?

period 需要是,而不是索引,否则我会使用数组。)

【问题讨论】:

  • 我不认为这是一个骗局,因为它专门针对文字值,它阻止(或至少使)旧标准 for (i in varname) { item=varname[i];...} 成语的使用。
  • 不,这不是一个重复,我希望句号连续包含“今天”、“昨天”等值。

标签: javascript for-loop


【解决方案1】:

是的,假设您不需要担心旧的 Javascript 引擎(例如 IE

['today','yesterday','this week','last week',
 'this month','last month'].forEach(function(period) {
 ...
})

【讨论】:

  • OP 说:“(句号必须是值,而不是索引,否则我会使用数组。)”
  • 而在上面的代码中,period 是值,而不是索引。问题不在于使用数组本身;问题是for varname in arrayvarname 设置为索引而不是值。 forEach 没有这个问题。
  • 是的,在这种情况下period 是值。
  • 我想 OP 当时没有清楚地表达他的问题,因为他的示例迭代了键。我撤回了我的反对票。
  • OP 想要迭代值 todayyesterday 等。在他的代码中,他使用了一个带有这些值的对象作为键,因为这就是 for...in 迭代的内容结束了,但您也可以使用带有forEach 的数组。结果是相同的; key vs value 的细节只对解释他为什么不首先使用数组很重要。
【解决方案2】:

我会这样做:

var timePeriod = [ "today"
                 , "yesterday"
                 , "this week"
                 , "last week"
                 , "this month"
                 , "last month"
                 ];

for (var i in timePeriod) {
    with ({ period: timePeriod[i] }) {
        ...
    }
}

与@MarkReed 的解决方案相比,这有两个优点:

  1. 它适用于所有浏览器。
  2. 它更快,因为从未调用任何函数。

此外,with 语句的使用可以防止臭名昭著的 for 循环关闭问题。

【讨论】:

  • 您的第二点不正确。我的解决方案不调用任何函数。
  • 我没有将我的解决方案与您的解决方案进行比较。
  • 您说的是“其他解决方案”,其中包括除您之外的所有解决方案。
  • 有趣;我认为with 这些天因为它的范围混乱而被皱眉。
  • @MarkReed 只有当您不知道自己在读什么或写什么时,这才是危险的。否则非常安全。这也是制作let(块范围)变量的好方法。
【解决方案3】:

在 ES6 中这样做的一种方式是:

for (var period of ['today', 'yesterday', 'this week', 'last week', 'this month', 'last month']) {
    // ...        
}

Firefox 支持此功能。如果您的 js 引擎不支持它,请使用 ES6 转译器,否则您需要回退到旧的解决方案。

【讨论】:

  • JavaScript 没有 for of 循环。
  • @MarkReed 谢谢,我在回答中改变了我的语气。可能是误会了。
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多