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

如何深度遍历嵌套对象提取电影标题至独立对象?

深度遍历嵌套对象提取电影标题的通用方案

我们需要处理多层嵌套的JavaScript对象movies,遍历所有层级提取每个电影对象的title属性,最终生成以电影ID为键、标题为值的movieTitles对象。现有实现仅支持两层嵌套,无法适配animated这类更深层级结构,且需兼容未来新增的嵌套分类。

原始数据示例

const movies = {
  action: {
    actionMovie1: {
      title: "Action Movie 1",
      rating: 5,
    },
    actionMovie2: {
      title: "Action Movie 2",
      rating: 5,
    },
    actionMovie3: {
      title: "Action Movie 3",
      rating: 5,
    },
  },

  adventure: {
    adventureMovie1: {
      title: "Adventure Movie 1",
      rating: 5,
    },
    adventureMovie2: {
      title: "Adventure Movie 2",
      rating: 5,
    },
    adventureMovie3: {
      title: "Adventure Movie 3",
      rating: 5,
    },
  },

  animated: {
    new: {
      newAnimatedMovie1: {
        title: "New Animated Movie 1",
        rating: 5,
      },
      newAnimatedMovie2: {
        title: "New Animated Movie 2",
        rating: 5,
      },
    },
    reviewed: {
      reviewedAnimatedMovie1: {
        title: "Reviewed Animated Movie 1",
        rating: 5,
      },
      reviewedAnimatedMovie2: {
        title: "Reviewed Animated Movie 2",
        rating: 5,
      },
    },
  },
};

预期结果

const movieTitles = {
  actionMovie1: "Action Movie 1",
  actionMovie2: "Action Movie 2",
  actionMovie3: "Action Movie 3",

  adventureMovie1: "Adventure Movie 1",
  adventureMovie2: "Adventure Movie 2",
  adventureMovie3: "Adventure Movie 3",

  newAnimatedMovie1: "New Animated Movie 1",
  newAnimatedMovie2: "New Animated Movie 2",

  reviewedAnimatedMovie1: "Reviewed Animated Movie 1",
  reviewedAnimatedMovie2: "Reviewed Animated Movie 2",
};

当前代码的问题

现有代码仅支持两层嵌套,无法处理更深层级的结构:

const movieTitles = Object.fromEntries(
  Object.values(movies).flatMap((movie) =>
    Object.entries(movie).map(([key, value]) => [key, value.title])
  )
);

它只遍历了movies的直接子对象(如action、adventure),无法深入到animated下的new、reviewed等更深层级,导致部分电影标题无法提取。

通用解决方案

方案1:递归遍历

递归方案逻辑直观,适合大多数嵌套深度场景:

function extractMovieTitles(obj) {
  const result = {};
  for (const [key, value] of Object.entries(obj)) {
    // 识别电影对象:包含title属性
    if (value.hasOwnProperty('title')) {
      result[key] = value.title;
    } else if (typeof value === 'object' && value !== null) {
      // 递归处理嵌套对象,合并结果
      Object.assign(result, extractMovieTitles(value));
    }
  }
  return result;
}

// 生成目标对象
const movieTitles = extractMovieTitles(movies);

该函数会遍历对象的每个键值对,遇到电影对象则提取标题,遇到嵌套对象则递归处理,最终合并所有结果。

方案2:迭代式遍历(无递归)

迭代式使用栈结构处理,避免递归可能的栈溢出问题,适合极深嵌套场景:

function extractMovieTitlesIterative(obj) {
  const result = {};
  const stack = [obj];
  
  while (stack.length > 0) {
    const current = stack.pop();
    for (const [key, value] of Object.entries(current)) {
      if (value.hasOwnProperty('title')) {
        result[key] = value.title;
      } else if (typeof value === 'object' && value !== null) {
        stack.push(value);
      }
    }
  }
  
  return result;
}

// 生成目标对象
const movieTitles = extractMovieTitlesIterative(movies);

通过栈保存待处理的对象,每次取出一个对象遍历,遇到嵌套对象则压入栈继续处理,直到所有层级遍历完成。

两种方案均能适配任意层级的嵌套结构,未来新增分类层级也无需修改代码,直接调用即可生成符合预期的movieTitles对象。

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:45:34