移除对象中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
相关产品推荐
相关产品推荐

