【问题标题】:Define looping condition array/object in syntax For loop在语法 For 循环中定义循环条件数组/对象
【发布时间】:2014-08-11 11:13:49
【问题描述】:

当我循环一个数组或对象时,我经常使用这种方式:

var arrCars = ["opel" , "audi" , "volvo" , "volkswagen" , 
              "renault" , "porsche" , "infinity" , "lexus"];

for (var i = 0, a; a = arrCars[i]; i++) {
  alert(a);
}

fiddle

在我看来,它给出了清晰的短代码,而不是例如这个:

for (var i = 0; i < arrCars.length; i++) {
  alert(arrCars[i]);
}

在这个例子中这不是一个大问题,但是当有一些嵌套对象等时,它会提供很多代码。

您可以在此问题here 下看到许多语法可能性。但我仍然不知道如何循环遍历数组的一部分。例如,如何使用我的首选语法只循环前 3 个值。当然,我可以使用额外的条件语句,但我想知道如何在 for 语法本身中包含这个条件,例如:“for (var i = 0; i i++){}”当然可以。

【问题讨论】:

  • 我讨厌你喜欢的语法 - 略读时看起来很混乱(只是我的意见:))
  • 如果数组可以包含0false 或空字符串,则循环不起作用。你的第二个循环根本不起作用,我想你忘记了i &lt; arrCars.length
  • @tymeJV 也许我喜欢它,因为我经常在 SQL 中使用别名。对我来说,这是有序的。

标签: javascript arrays object for-loop conditional-statements


【解决方案1】:

看了建议后,你想要的是这样的:

for (var i = 0, a; (a = arrCars[i]) && i < 3; i++) {
    ...
}

看来你不能把赋值放在第一个位置以外的任何地方(甚至括号都不能解决这个问题)并且你需要在它周围加上括号来防止赋值给arrCars[i] &amp;&amp; i &lt; 3

我同意其他 cmets,您最好不要有一个评估为 false 的数组项。

【讨论】:

  • 您可以将作业放在任何地方,括号可以解决它。看我的回答。
  • 嗯,当我尝试使用括号时,它不起作用。我可能打错了。
【解决方案2】:

由于我在评论中提到的原因,我不喜欢你的语法。但要回答这个问题:

for (var i = 0, a; i < 3 && (a = allCars[i]); i++)

FIDDLE

【讨论】:

  • 谢谢,我忘了条件。好吧,我总是乐于接受改进建议;-)。
  • 它不起作用。 FIDDLE。 Firebug 说 ReferenceError: invalid assignment left-hand.
  • 添加了括号和一个演示它的小提琴
【解决方案3】:
for (var i = 0, a; ((a = arrCars[i]) || true) && i < 3; i++) {
    doStuff(a);
}

将赋值放在括号中可确保赋值不会变成布尔值,然后将该赋值的结果与 true 进行 OR'ing 以确保数组中计算结果为 false 的元素不会打破你的for 循环。然而在这一点上,整个for 循环线在我看来是相当可怕的。我一直都是这样做的:

for (var i = 0; i < 3; i++) {
    var a = arrCars[i];

    doStuff(a);
}

它不是那么简洁,但我一直更喜欢可读性而不是紧凑性。让 minifier 负责压缩。

【讨论】:

  • 当我尝试您的解决方案时,我只得到 true
  • @Dinizworld 这就是我不用尝试就通过手机接听的结果!已编辑。
  • @tophyr,我已经在考虑括号的方向了。我只在这种情况下尝试过。在你的编辑之后,它完全符合我的意思。谢谢!
  • 我再次编辑以解决“假”元素问题,并评论了整行的丑陋程度:) 我个人更喜欢手动将a 分配与for 循环分开逻辑,虽然我确实发现你在 OP 中的语法很有趣(即使它让这种特殊情况很痛苦)。
  • 如果数组少于 3 个元素,您的第一个循环将不起作用,它将使用 undefined 来处理缺失的元素。 || true 使其忽略元素是否存在。见jsfiddle.net/barmar/VJ97Z/5
【解决方案4】:

你在正确的轨道上。

var myArray = ["0", "1", "2", "3", "4"];

for (var i = 0; i < 4; i++) {
alert(i);
}

这将为您的数组元素 0 - 2(数组中的前 3 个)引发警告消息

【讨论】:

  • 对不起,我忘记了第二个示例中的条件,它应该是一个工作示例,它如何在没有数组/对象的情况下工作。你的解决方案不是我想要的。
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多