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

移除对象中recipeStep为heat的封装对象技术求助

解决方法:保留完整对象结构的同时过滤步骤

我懂你的困扰啦——你之前的代码只提取了过滤后的步骤数组,却把食谱和餐食的其他关键信息都弄丢了。问题出在嵌套的map只返回了过滤后的recipeMealSteps数组,没有保留原对象的其他属性。咱们来修正这个逻辑:

核心思路

要保留完整的对象层级,我们需要在map中返回包含原有所有属性+过滤后步骤的新对象,而不是只返回步骤数组。可以用对象展开运算符(...)快速复制原对象的所有属性,再覆盖需要修改的recipeMealSteps字段。

正确代码实现

let meals = [
  {
    mealId: 0,
    mealDescription: "Favourties",
    mealTypeRecipes: [
      {
        recipeAuthor: "Frank Doe",
        recipeDescription: "Great chicken dish for those that don't eat chicken",
        recipeID: 0,
        recipeMealSteps: [
          { recipeDesc: "Heat up the oven", recipeStep: "heat" },
          { recipeDesc: "Allow it to cook", recipeStep: "cool" },
          { recipeDesc: "Take it out the oven", recipeStep: "out" },
        ],
      },
      {
        recipeID: 1,
        recipeName: "Fish Dish",
        recipeMealSteps: [
          { recipeDesc: "Heat up the oven", recipeStep: "heat" },
          { recipeDesc: "Allow it to cook", recipeStep: "cool" },
          { recipeDesc: "Take it out the oven", recipeStep: "out" },
        ],
      },
    ],
  },
];

// 正确的过滤逻辑:保留完整对象结构
let filteredRecipes = meals.map(meal => ({
  // 保留餐食的所有原有属性
  ...meal,
  // 处理每个餐食下的食谱列表
  mealTypeRecipes: meal.mealTypeRecipes.map(recipe => ({
    // 保留食谱的所有原有属性
    ...recipe,
    // 过滤掉recipeStep为"heat"的步骤
    recipeMealSteps: recipe.recipeMealSteps.filter(step => step.recipeStep !== 'heat')
  }))
}));

console.log(filteredRecipes);

代码细节解释

  • 外层map遍历每个meal:用...meal复制餐食的所有属性(比如mealId、mealDescription),再重新定义mealTypeRecipes字段。
  • 内层map遍历每个recipe:用...recipe复制食谱的所有属性(比如recipeAuthor、recipeID),再把recipeMealSteps替换为过滤后的数组。
  • filter方法的逻辑和你原来的一致,但现在它是作为新食谱对象的一个属性存在,而非单独返回数组。

这样得到的filteredRecipes会完整保留餐食、食谱的层级结构,只是移除了所有recipeStep为"heat"的步骤~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:32:36