【问题标题】:Exit of foreach when pass by a if conditional通过 if 条件时退出 foreach
【发布时间】:2016-09-03 09:20:30
【问题描述】:

我的代码有逻辑问题。

object.forEach(function(item) {
  if (item.a === $scope.a) {
    //doSomething
  }
  else {
    //doOtherStuff
 }
});

所以,基本上,我想运行对象并比较 $scope 是否存在于对象中。如果 $scope 存在,做一些事情并在 forEach 上退出,否则,做其他事情并退出。最好的方法是什么?

我的逻辑问题是它在 forEach 内部运行,并且对于每个索引,都在做某事。也许我必须使用另一种我还不知道的方法,你能帮帮我吗?

【问题讨论】:

  • 我希望你用名称object 声明的实际上是一个数组。
  • 在这两种情况下都想退出有点奇怪(条件为真或假),这实际上意味着您永远不会真正迭代,而只想对第一项采取行动。那么问题来了:你为什么要使用forEach,而不是只挑第一个元素并在上面做你的逻辑?
  • @trincot 不只是针对第一个元素,我想在对象内部进行迭代以比较 $scope.a 是否存在于项目中,如果存在,我想做一些事情并退出。跨度>
  • 好的,只是在你的问题中你写了else,做其他事情也退出。这意味着你总是退出......我想这不是你真正在做的事情。

标签: javascript angularjs foreach conditional


【解决方案1】:

改用every:

Object.keys(object).every(function(item) {
    if (some_exit_condition) {
        return false; // don't call this callback again for next items
    else {
        // don't stop, keep going
        return true;
    }
});

如果object 是类似数组的对象(可迭代),则无需在其上调用Object.keys()。这取决于您要迭代的内容。使用Object.keys(),您可以迭代该对象的所有属性,并在回调函数中编写object[item] 以获取该属性的值。

some 方法具有类似的行为,但您必须返回 true 以停止迭代,并返回 false 以继续。

every()some() 都有一个布尔返回值,这也将它们与forEach() 区分开来。使用该返回值,您可以知道是否有明确的“退出”。

【讨论】:

  • 是的,every 适用于算法的特定行为,这个问题解决了一半,谢谢!
【解决方案2】:

也许你可以使用 array.prototype.filter() 来简化你的代码。

您可以查看更多信息here

你兼容ie9,但我认为应该有一个jquery函数可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2018-10-05
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多