繁体   English   中英

从嵌套的对象数组中获取数组

[英]Get array from nested array of objects

我想知道是否有办法从嵌套数组中的对象中提取值,在某种组合中使用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

如果您忘记了数组和对象等,这是一种先进的“获取”,它可以按照您的预期运行。

我不认为使用lodash是可能的,而是查找json路径。 相应的JSON路径查询将是arr[*].a 请参阅下面的工作示例,其中我使用 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> 

您可以创建遍历键并提取值的递归函数。 如果值的类型是数组,则它使用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 }] }] })); 

您可以采用完整的动态方法并查找给定的键并获取键匹配的部分。

结果总是一个数组。

如果需要,您可以添加一个检查,它会拉出唯一的项目并将其返回。

 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM