【问题标题】:Conditional statement inside for(var key in object) Javascriptfor(var key in object) Javascript 中的条件语句
【发布时间】:2020-08-31 08:05:39
【问题描述】:

我有一个带有特定键的 json 数据,如下所示:

var object = {"85":{"id":"50","nosurat":"2020-PKL-001","user_created":"02211"},"69":{"id":"50","nosurat":"2020-PKL-002","user_created":"02212"},"104":{"id":"50","nosurat":"2020-PKL-003","user_created":"02213"}};

所以,为了迭代它,我使用 for 方法。 问题是如何在for方法内部制作过滤器,但只执行一次?

for(var keys in object){
   if(object[keys].nosurat == "2020-PKL-001"){
      functionx();
   }
}

在上面的代码中,functionx() 执行了 3 次,因为一旦它为真,它将循环遍历我的对象拥有的尽可能多的键。如何让functionx()只偶尔执行一次,只在条件满足时才执行,假设还会有另一个key满足条件。

【问题讨论】:

  • 在上面写上break;
  • @AlwaysHelping 他说他只希望函数执行一次,而不是在函数执行后停止循环。大不同。
  • functionx 只执行一次。
  • for...in 是一个语句,而不是一个方法。

标签: javascript jquery arrays json


【解决方案1】:

或者你可以使用Array.prototype.some():

var obj = {"85":{"id":"50","nosurat":"2020-PKL-002","user_created":"02211"},"69":{"id":"50","nosurat":"2020-PKL-001","user_created":"02212"},"104":{"id":"50","nosurat":"2020-PKL-001","user_created":"02213"}};
function functionx(o){console.log(o)}
console.log('=== correct behaviour ========================');
Object.values(obj).some(o=>o.nosurat=="2020-PKL-001" && functionx(o) || true);

console.log('=== alternative correct version ==============');
Object.values(obj).some(o=>o.nosurat=="2020-PKL-001" && (functionx(o),true) );

console.log('===== WRONG behaviour (previous version ======');
Object.values(obj).some(o=>o.nosurat=="2020-PKL-001" && functionx(o));
.as-console-wrapper {max-height:100% !important}

编辑
糟糕,我刚刚更正了一个小细节:我忘了提到在我的原始解决方案中functionx(o) 需要返回一些“真实”值,否则some() 中仍然会发生多次调用

我现在将代码的相关部分更改为(functionx(o) || true)。这将确保some() 在第一次functionx() 调用之后肯定停止(无论functionx 可能返回什么)。

.some() 循环的函数中对&& 的进一步评论:布尔表达式的求值遵循JavaScript 中严格的“惰性”规则(与几乎所有其他语言一样):术语从左到右求值只有必要时才能得到整个表达式的结果。因此,如果&& 之前的项计算为false,则表达式的整体结果已确定,&& 之后的任何内容都无法再改变它。因此functionx不会在这些情况下被调用,false 将返回到调用.some() 循环。

【讨论】:

  • 鉴于对 OP 问题的修改,这是正确的答案。
  • 干得好!这就是我要找的,先生!所以最好的方法不是使用for in,而是使用some();谢谢你们,你们是救命恩人!
  • 没有。如果添加true,那么它将执行一次,而不是每次满足条件时执行一次。你之前的代码很完美。
  • 末尾的|| true必要的,请再次查看我编辑的帖子。我稍微改变了数据,所以匹配发生在第二个元素上。在“错误”版本中,将显示第二个 第三个元素,这 不是 OP 想要的。
  • 我尝试了您的旧代码,它按我的意愿工作。我还没试过你的新的。另外,还有一个问题要问:some() 中的&& 是什么?据我所知,它执行第一个函数(箭头函数),然后执行下一个函数。这是真的吗?感谢您的回复,非常感谢!
【解决方案2】:
for(var keys in object){
   if(object[keys].nosurat == "2020-PKL-001"){
      functionx();
      break
   }
}

【讨论】:

  • cmets 明确表示这不是 OP 想要的行为。
  • 好吧,当我写答案时,我没有看到cmets
  • 对不起,您没有错。是我问错了问题。我感谢所有愿意提供帮助的人。谢谢。
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多