如何用Lodash从JSON对象提取文件夹及输出?如何构建指定新数组?
嘿,我来帮你解决这两个和Lodash相关的问题,结合你的场景一步步说清楚~
1. 使用Lodash从JSON对象中提取所有文件夹和输出
首先咱们得明确JSON的结构,通常文件夹数据会是嵌套的(比如包含子文件夹/文件),下面我用一个典型的示例结构来演示:
// 示例JSON对象 const fileSystemData = { id: 1, name: "root", type: "folder", output: "root-build-output", children: [ { id: 2, name: "docs", type: "folder", output: "docs-build-output" }, { id: 3, name: "resume.pdf", type: "file", output: "pdf-output" }, { id: 4, name: "assets", type: "folder", children: [ { id:5, name: "images", type: "folder", output: "images-build-output" } ]} ] };
如果要递归提取所有type为folder的项,并保留name和output字段,用Lodash可以这样写:
const getAllFoldersWithOutput = (data) => { let result = []; // 先判断当前项是否是文件夹,是就加入结果 if (data.type === "folder") { result.push(_.pick(data, ["name", "output"])); } // 如果有子节点,递归处理子节点并合并结果 if (_.has(data, "children")) { result = [...result, ..._.flatMap(data.children, getAllFoldersWithOutput)]; } return result; }; // 调用函数 const folders = getAllFoldersWithOutput(fileSystemData); console.log(folders);
输出结果会是:
[ { name: 'root', output: 'root-build-output' }, { name: 'docs', output: 'docs-build-output' }, { name: 'assets', output: undefined }, // 如果该文件夹没有output字段会显示undefined { name: 'images', output: 'images-build-output' } ]
如果你喜欢链式调用的写法,也可以用_.flatMapDeep简化:
const folders = _.flatMapDeep(fileSystemData, (item) => { if (item.type === "folder") { return [_.pick(item, ["name", "output"]), ...(item.children || [])]; } return []; });
2. 循环时创建仅含文件夹和输出的新数组
根据你的场景:循环中数据存在不同数组里,这些数组可能包含文件夹项和嵌套数组,最终要生成只保留文件夹+output的新数组。
假设你现在有这些待处理的数组:
const batch1 = [ { type: 'folder', name: 'batch1-folder1', output: 'batch1-out1' }, { type: 'file', name: 'batch1-file1', output: 'file-out1' }, [{ type: 'folder', name: 'batch1-subfolder', output: 'batch1-sub-out' }] // 嵌套数组 ]; const batch2 = [ { type: 'folder', name: 'batch2-folder1', output: 'batch2-out1' }, { type: 'folder', name: 'batch2-folder2', output: 'batch2-out2' } ];
可以分两步处理:
- 用
_.flattenDeep把所有嵌套的数组打平,统一成一维数组 - 筛选出
type为folder的项,再提取需要的字段
代码实现如下:
// 1. 合并所有数组并打平嵌套结构 const allRawData = _.flattenDeep([batch1, batch2]); // 2. 筛选文件夹并提取name和output字段 const finalFoldersArray = _.map( _.filter(allRawData, { type: 'folder' }), item => _.pick(item, ['name', 'output']) ); console.log(finalFoldersArray);
输出结果:
[ { name: 'batch1-folder1', output: 'batch1-out1' }, { name: 'batch1-subfolder', output: 'batch1-sub-out' }, { name: 'batch2-folder1', output: 'batch2-out1' }, { name: 'batch2-folder2', output: 'batch2-out2' } ]
如果是在循环过程中实时处理(比如每次循环拿到一个数据块就处理),可以这样写:
const finalResult = []; // 假设这是你的循环数据源 const dataBatches = [batch1, batch2, batch3]; _.forEach(dataBatches, (batch) => { // 打平当前批次的嵌套数组 const flattenedBatch = _.flattenDeep(batch); // 筛选文件夹并提取字段,添加到最终结果 finalResult.push(..._.map( _.filter(flattenedBatch, { type: 'folder' }), item => _.pick(item, ['name', 'output']) )); });
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

