You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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' }
];

可以分两步处理:

  1. 用_.flattenDeep把所有嵌套的数组打平,统一成一维数组
  2. 筛选出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:18:49