如何基于对象条目过滤JSON文件?对象结构JSON处理方案
问题
我的餐品数据以键值对对象的形式存储(而非对象数组),例如breakfastFood.json片段:
{ "1": {"name": "芦笋番茄炒鸡蛋", "stars": 4, "price": "", "disease": "Diabetes", "image_uri":"xxx", "meal_time": "breakfast"}, "2": {"name": "希腊酸奶配混合莓果与碎杏仁", "stars": 3, "price": 0, "disease": "Diabetes", "image_uri":"xxx", "meal_time": "breakfast"}, "3": {"name": "燕麦煎饼配蓝莓", "stars": 4, "price": 0, "disease": "Diabetes", "image_uri":"xxx", "meal_time": "breakfast"}, "4": {"name": "希腊酸奶配坚果、莓果与蜂蜜", "stars": 4, "price": 0, "disease": "Diabetes", "image_uri":"xxx", "meal_time": "breakfast"}, "5": {"name": "鸡肉粥", "stars": 5, "price": 0, "disease": "Diabetes", "image_uri":"xxx", "meal_time": "breakfast"} }
需要根据selectedDiseases数组过滤餐品:仅保留disease字段值存在于该数组中的餐品。
我已经掌握了对象数组的过滤方法:
const filteredBreakfast = foodChoicesForBreakfast.filter((meal) => selectedDiseases.includes(meal.disease) ); const filteredLunch = foodChoicesForLunch.filter((meal) => selectedDiseases.includes(meal.disease) ); const filteredDinner = foodChoicesForDinner.filter((meal) => selectedDiseases.includes(meal.disease) ); const filteredFoodChoices = { breakfast: filteredBreakfast, lunch: filteredLunch, dinner: filteredDinner, };
但面对键值对结构的对象,不知道如何实现相同的过滤逻辑?
解决方案
方法1:转数组过滤后转回对象
利用Object.entries()把对象转成键值对数组,用你熟悉的filter方法筛选,最后通过Object.fromEntries()转回键值对对象(保留原键名):
// 假设早餐数据已导入为breakfastFood对象 const filteredBreakfast = Object.fromEntries( Object.entries(breakfastFood).filter(([key, meal]) => selectedDiseases.includes(meal.disease) ) ); // 午餐、晚餐同理 const filteredLunch = Object.fromEntries( Object.entries(lunchFood).filter(([key, meal]) => selectedDiseases.includes(meal.disease) ) ); const filteredDinner = Object.fromEntries( Object.entries(dinnerFood).filter(([key, meal]) => selectedDiseases.includes(meal.disease) ) ); // 最终整理结果 const filteredFoodChoices = { breakfast: filteredBreakfast, lunch: filteredLunch, dinner: filteredDinner, };
如果最终需要数组格式(和你之前的代码输出一致),直接取过滤后对象的值即可:
const filteredBreakfast = Object.values(breakfastFood).filter(meal => selectedDiseases.includes(meal.disease) );
方法2:遍历键构建新对象
手动遍历原对象的所有键,将符合条件的餐品添加到新对象中:
// 封装成通用函数,复用性更高 function filterFoodByDisease(foodObj, targetDiseases) { const result = {}; for (const key in foodObj) { // 确保遍历的是对象自身的属性 if (foodObj.hasOwnProperty(key)) { const meal = foodObj[key]; if (targetDiseases.includes(meal.disease)) { result[key] = meal; } } } return result; } // 使用示例 const filteredBreakfast = filterFoodByDisease(breakfastFood, selectedDiseases); const filteredLunch = filterFoodByDisease(lunchFood, selectedDiseases); const filteredDinner = filterFoodByDisease(dinnerFood, selectedDiseases); const filteredFoodChoices = { breakfast: filteredBreakfast, lunch: filteredLunch, dinner: filteredDinner, };
内容的提问来源于Stack Exchange,提问作者adrill
相关产品推荐
相关产品推荐

