javascript / lodash:由于子树对象,如何在对象中进行递归深入获取

时间:2016-07-09 14:30:23

标签: javascript object lodash

假设我有一个像这样的深层对象

cont obj = { 
   a0: { 
     b0: { 
       c0: 0, 
       c1: 1 
      }, 
      b1: { 
       c2: 2
      } 
     }
 }

我希望用一种方法用这种api检索它的子树,让它命名为'retrieveDeep':

const subObj = retrieveDeep(
 obj,
 {
  a0: {
    b0: {
      c0: null
    },
    b1: {
      c2: null
    }
  }
 } 
)
// should return 
// { 
//   a0: { 
//     b0: { 
//       c0: 0
//      }, 
//      b1: { 
//       c2: 2
//      } 
//     }
// } 

我实际上知道我可以从头开始实现它并没有那么多困难,但如果已经有一个lodash(或者看起来有点像graphQL api形状!)函数,我很乐意知道它 TX

3 个答案:

答案 0 :(得分:1)

只需迭代模式的属性并对对象进行递归调用。分配原始值。



function retrieveDeep(object, pattern) {
    function iter(o, p, r) {
        Object.keys(p).forEach(function (k) {
            if (k in o) {
                if (typeof o[k] === 'object' && o[k] !== null) {
                    r[k] = {};
                    iter(o[k], p[k], r[k]);
                    return;
                }
                r[k] = o[k];
            }
        });
    }
    
    var result = {};
    iter(object, pattern, result);
    return result;
}

var obj = { a0: { b0: { c0: 0, c1: 1 }, b1: { c2: 2 } } },
    subObj = retrieveDeep(obj, { a0: { b0: { c0: null }, b1: { c2: null } } });

console.log(subObj);




答案 1 :(得分:1)

使用lodash 1+,使用 _。at(object,[paths])的方式最短:



let exist = {
  a:{
    b: {c: 3}
  }, 
  ZZ: 2
};
    
let resExist = _.at(exist, 'a.b.c').pop() // => 3

let notExit = { a : 1 }
    
let resNoExist = _.at(notExit, 'a.b.c').pop() // undefined
    
console.log('resExist', resExist)
console.log('resNoExist', resNoExist)

<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

请参阅documention

答案 2 :(得分:0)

Lodash get方法:_.get(object, path, [defaultValue])

var object = { 
  'a': [
    { 
      'b': { 
        'c': 3 
      } 
    }
  ] 
};

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default