查找具有特定值的对象

时间:2016-07-15 13:55:50

标签: javascript object

我有一个树形结构对象,例如

var x = [{
  id: 1,
  children: [{
    id: 11,
    children: [],
  }, {
    id: 12,
    children: [{
      id: 121,
      name:'jogn',
      children: []
    }]
  }]
}, {
  id: 2,
  children: [],
}]

我想在其中找到具有特定ID的对象。我做了

function printObj(obj , val) {
  for( var i = 0; i < obj.length ; i++){
         if( obj[i].id == val){
         return obj[i];
         }
         if( obj[i].children.length > 0 ){
            printObj( obj[i].children)
         }
    }
}

功能。问题是当我调用它时

var g = printObj(x , 121);
alert(x.name)

它返回undefined而不是jogn altought当我弹出一些警告如果它找到它确实找到它的设定值。为什么它会返回错误的对象呢?

2 个答案:

答案 0 :(得分:3)

这一行有两个问题:

printObj( obj[i].children);
  1. 它缺少第二个参数

  2. 如果找到

  3. ,您需要返回结果

    所以

    var possibleResult = printObj( obj[i].children, val);
    // -------------------------------------------^^^^^
    if (possibleResult) {
        return possibleResult;
    }
    

    另外,在您的测试中,您查找了x.name您想要的地方g.name

    修正:

    &#13;
    &#13;
    var x = [{
      id: 1,
      children: [{
        id: 11,
        children: [],
      }, {
        id: 12,
        children: [{
          id: 121,
          name: 'jogn',
          children: []
        }]
      }]
    }, {
      id: 2,
      children: [],
    }];
    
    function printObj(obj, val) {
      for (var i = 0; i < obj.length; i++) {
        if (obj[i].id == val) {
          return obj[i];
        }
        if (obj[i].children.length > 0) {
          var possibleResult = printObj(obj[i].children, val);
          if (possibleResult) {
            return possibleResult;
          }
    
        }
      }
    }
    
    var g = printObj(x, 121);
    console.log(g.name);
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

Ramda非常适用于功能方法的对象和列表工作 - 这是您遍历的数据 -


    var x = [{
      id: 1,
      children: [{
        id: 11,
        children: [],
      }, {
        id: 12,
        children: [{
          id: 121,
          name: 'jogn',
          children: []
        }]
      }]
    }, {
      id: 2,
      children: [],
    }]


    const findById = (id, list) => map(o => {
      if(o.id === id) return o
      return findById(id, o.children)
    }, list)

    head(flatten(findById(121, x)))