我想知道是否有一种方法可以用lodash的get
组合形式从嵌套数组的对象中提取值:
const obj = { arr: [{ a: 2 },{ a: 3 }] };
get(obj, 'arr.a'); // [2, 3]
但是它仍然可以用于其他用途:
const obj = { nestedObj: { a: 4 } };
get(obj, 'nestedObj.a'); // 4
这是一种高级的“获取”功能,如果您忘记了数组和对象等,它将按您期望的方式工作。
答案 0 :(得分:0)
我认为使用lodash不可能实现,而是查找json路径。相应的JSON路径查询将为arr[*].a
。请参阅下面的工作示例,其中我使用this json路径实现。还有更多实现,请选择最适合您的实现。
const obj = { arr: [{ a: 2 },{ a: 3 }] };
console.log(jsonpath.query(obj, "arr[*].a")); // [2, 3]
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.0.1/jsonpath.js"></script>
答案 1 :(得分:0)
您可以创建一个遍历键并提取值的递归函数。如果值的类型是数组,则它使用Array.map()
(可能是Array.flatMap()
来处理嵌套数组)进行迭代。
const getFn = (path, obj) => {
const inner = ([key, ...path], obj) => {
if(!path.length) return obj[key];
return Array.isArray(obj[key]) ?
obj[key].map(o => inner(path, o)) :
inner(path, obj[key]);
}
return inner(path.split('.'), obj);
}
console.log(getFn('arr.a', { arr: [{ a: 2 },{ a: 3 }] }));
console.log(getFn('nestedObj.a', { nestedObj: { a: 4 } }));
console.log(getFn('arr.a.b', { arr: [{ a: [{ b: 1 }, { b: 2 }] },{ a: [{ b: 1 }, { b: 2 }] }] }));
答案 2 :(得分:0)
您可以采用完整的动态方法,查找给定的键,然后选择键匹配的部分。
结果始终是一个数组。
如果需要,您可以添加一张支票,该支票将拉出唯一的物品并将其退回。
function getValues(object, path) {
var [key, ...rest] = path.split('.');
if (!rest.length && key in object) return [object[key]];
return Object.entries(object).reduce((r, [k, v]) => {
if (!v || typeof v !== 'object') return r;
if (k === key) r.push(...getValues(v, rest.join('.')));
r.push(...getValues(v, path));
return r;
}, []);
}
console.log(getValues({ arr: [{ a: 2 }, { a: 3 }] }, 'arr.a')); // [2, 3]
console.log(getValues({ nestedObj: { a: 4 } }, 'nestedObj.a')); // 4