JavaScript中如何获取forEach函数的返回值并跳出循环?

29

我该如何修改这段代码,以便我可以获取field.DependencyFieldEvaluated的值,并在获得这个值后尽快退出函数?

function discoverDependentFields(fields) {
                    fields.forEach(function (field) {
                        if (field.DependencyField) {
                            var foundFields = fields.filter(function (fieldToFind) { return fieldToFind.Name === field.DependencyField; });
                            if (foundFields.length === 1) {
                               return field.DependencyFieldEvaluated = foundFields[0];

                            }
                        }
                    });
                }

以上函数有什么问题吗? - egig
1
为什么不使用 for 循环而是使用 forEach 函数呢? - tdragon
2
你不能从forEach()中跳出,尝试使用every代替。https://dev59.com/5m025IYBdhLWcg3wAxF9 - gurvinder372
2
@Maryam - .forEach() 函数应该继续循环 - 它会忽略你的函数返回值。如果你使用 .every() 可以提前退出,但是只能通过返回 false 来实现 - 也就是说,你不能直接将一个值返回给循环之外的代码,而是必须将该值赋给在循环之外声明的变量。如果你真正想要的是从 discoverDependentFields() 函数中返回该值,那么最简单的方法就是使用传统的 for 循环。 - nnnnnn
我尝试了for循环。问题是在嵌套函数中,它无法访问fields[i]。有什么解决方法吗? - Maryam
显示剩余2条评论
3个回答

27

使用一个好的传统的 for 循环:

function discoverDependentFields(fields) {
  for (var fieldIndex = 0; fieldIndex < fields.length; fieldIndex ++) {
    var field = fields[fieldIndex];

    if (field.DependencyField) {
      var foundFields = fields.filter(function(fieldToFind) {
        return fieldToFind.Name === field.DependencyField;
      });
      if (foundFields.length === 1) {
        return foundFields[0];
      }
    }
  }
}

如果您想保持高端, 再次使用filter:

function discoverDependentFields(fields) {
  return fields.filter(function(field) {
    if (field.DependencyField) {
      var foundFields = fields.filter(function(fieldToFind) {
        return fieldToFind.Name === field.DependencyField;
      });
      if (foundFields.length === 1) {
        return foundFields[0];
      }
    }
  })[0];
}

这个解决方案有效!谢谢 :) - Maryam

10

你可以使用fields.map代替fields.forEach。以下是一个示例:

var source=[1,2,3,4,5];

var destination=source.map(function(item){
 if(item==3)
     return 'OUTPUT';
}).filter(function(item){return item;})[0];

console.log(destination); // prints 'OUTPUT'


-11

在编程中,如果你想要跳出某个循环或函数,可以使用return语句,如下所示。

[1, 2, 3, 4, 5, 6].forEach(function(value){
  if(value > 2) return; 
  console.log(value)
});

在哪个方面中断?您在forEach中传递的回调函数对数据的每个项目执行,因此不能具有单个返回值。但是,如果您想要针对特定条件不处理回调,则可以使用return。如果您能提供问题本身而不是代码,我想我可能能够帮助,但不确定 :) - Ravi Tiwari
在 .forEach() 回调函数中的 return 语句的行为类似于 continue,而不是 break。但无论如何,如果您查看问题中的代码,您会发现 OP 已经尝试使用 return - nnnnnn

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