假设我有一个像这样的深层对象
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
答案 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;
请参阅documention
答案 2 :(得分:0)
_.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