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

如何基于对象条目过滤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:33