You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归JavaScript函数返回值丢失:嵌套JSON字段检索异常

解决递归检索嵌套JSON字段时返回值丢失的问题

我明白你遇到的问题了——用angular.forEach做递归遍历的时候,很容易出现返回值“丢失”的情况,这是因为forEach的回调里的return并不会把值传递给外层函数,也没法提前终止整个遍历。咱们来一步步修复这个问题:

问题根源

angular.forEach的回调函数里的return只是用来跳过当前迭代的,它不会把结果返回给getField函数,也不会停止后续的循环。所以当你在递归里找到匹配的字段后,这个值没法正确传递到最外层的调用。

修正后的递归函数

咱们改用普通的for循环来实现,这样能灵活控制遍历的终止和返回值的传递:

var getField = function(thisPath, theseFields) {
  // 处理默认参数,如果只传了thisPath,就用$scope.fields作为默认值
  theseFields = theseFields || $scope.fields;
  
  // 遍历当前层级的字段
  for (var i = 0; i < theseFields.length; i++) {
    var field = theseFields[i];
    // 匹配到目标path,直接返回当前字段
    if (field.path === thisPath) {
      return field;
    }
    // 如果当前字段有子节点,递归检索子节点
    if (field.children && field.children.length > 0) {
      var foundField = getField(thisPath, field.children);
      // 如果递归找到了结果,立刻返回,不用继续遍历其他字段
      if (foundField) {
        return foundField;
      }
    }
  }
  
  // 遍历完所有字段都没找到,返回undefined
  return undefined;
};

代码说明

  • 默认参数处理:用theseFields = theseFields || $scope.fields替代原来的arguments.length判断,更简洁直观。
  • for循环替代forEach:普通for循环允许我们在找到匹配项时直接return,终止整个遍历并返回结果。
  • 递归结果检查:每次递归调用后,检查是否返回了有效值,如果有,就立刻把这个值返回给上层调用,避免不必要的遍历。

测试示例

用你给出的$scope.fields结构测试:

// 检索field1.one
var result = getField('field1.one');
console.log(result); // 会输出 {path: 'field1.one', children: []}

// 检索不存在的字段
var notFound = getField('field3');
console.log(notFound); // 输出 undefined

这样就能完美解决返回值丢失的问题啦!

内容的提问来源于stack exchange,提问作者Stephen Schultz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:34