js多层对象取某个值

吊人
  • 0
新手上路,请多包涵
$(function () {  
  var \_param = {  
    'body': {  
      'name': "周杰伦",  
      'list': \[  
        {  
          'age': '20'  
  }  
      \],  
      'in': {  
        'in\_name': '姓名',  
        'in\_1': {  
          'obj\_name': '张三',  
          'in\_2': {  
            'id': '111'  
  }  
        }  
      }  
    },  
    'result': {  
      'code': '10000',  
      'msg': '成功'  
  }  
  }  
  var \_val = findOutParam(\_param, 'id')  
  console.log(\_val)  
})  
  
function findOutParam(i\_item, fixed\_code) {  
  var fixed\_val = ''  
  for (var j in i\_item) {  
    var j\_item = i\_item\[j\]  
    try {  
      if (typeof JSON.parse(j\_item) == "object") {  
        j\_item = JSON.parse(j\_item)  
      }  
    } catch (e) {  
    }  
    if (typeof j\_item == 'object' || Array.isArray(j\_item)) {  
      fixed\_value = findOutParam(j\_item, fixed\_code)  
    } else {  
      if (j == fixed\_code) {  
        if (j\_item === 0) {  
          j\_item = '0'  
  }  
        fixed\_val = j\_item  
        flag = false  
 break  }  
    }  
  }  
  return fixed\_val  
}

通过递归的方式取值,但是取到值后,循环会继续执行它的父级循环,导致fixed_val 被重置了,求大神帮忙看看,当条件满足后怎么终止所有循环### 问题描述

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

回复
阅读 1.7k
2 个回答

这里我要寻找的值放在一个更高的位置:

function findOutParam(i_item, fixed_code) {
    var fixed_val = '';

    var find = (_i_item) => {
        for (var j in _i_item) {
            var j_item = _i_item[j];

            if (typeof j_item == 'object' || Array.isArray(j_item)) {
                find(j_item, fixed_code);
            } else {
                if (j == fixed_code) {
                    if (j_item === 0) {
                        j_item = '0';
                    }
                    fixed_val = j_item;
                    break;
                }
            }
        }
    };

    find(i_item);
    return fixed_val;
}

调用的方式不变:

var _val = findOutParam(_param, 'id');
console.log(_val); // '111'
function findParam(obj, key) {
  if (Object.prototype.toString.call(obj) == '[object Object]') {
    for (let k in obj) {
      if (k == key) {
        return obj[k];
      } else {
        let value = findParam(obj[k], key);
        if (value !== undefined) {
          return value;
        }
      }
    }
  } else if (Object.prototype.toString.call(obj) == '[object Array]') {
    for (let i in obj) {
      let value = findParam(obj[i], key);
      if (value !== undefined) {
        return value;
      }
    }
  }
}
宣传栏