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

React营养应用报错:nutritionData.map is not a function求助

Fixing the "nutritionData.map is not a function" Error

Let's break down why this error is popping up and fix it step by step.

Why the Error Happens

The map() method is only for arrays, but right now your nutritionData state is being set to an object—not an array.

Looking at your code:

setNutrition(data.hints[0].food.nutrients);

The Edamam API returns data.hints[0].food.nutrients as a key-value object (like { ENERC_KCAL: 52, CHOCDF: 14.03, PROCNT: 0.26, ... }). When you try calling map() on this object, React throws the error because objects don't have a built-in map() method.

Solutions

We have two approaches depending on how you want to render your Nutrition component:

1. Render All Nutrients Dynamically

If you want to loop through every nutrient in the object, convert the object to an array using Object.entries() (this gives you an array of [nutrientName, value] pairs). Then you can safely use map():

First, update your initial state to match the data type we're storing (an object, not an array):

const [nutritionData, setNutrition] = useState({});

Then adjust your render code:

return (
  <div>
    {Object.entries(nutritionData).map(([nutrientKey, nutrientValue]) => (
      <Nutrition 
        key={nutrientKey} 
        nutrientName={nutrientKey} 
        value={nutrientValue} 
      />
    ))}
  </div>
);
  • Important: Always add a unique key prop to items rendered in a list (we're using the nutrient's unique key like ENERC_KCAL here).

2. Render Specific Nutrients (Calories, Carbs, etc.)

If your Nutrition component expects specific props like calories and carbs, you don't need map() at all—just access the properties directly from the object. Add a check to avoid errors while the data is loading:

Update your initial state to null (since we'll be storing an object eventually):

const [nutritionData, setNutrition] = useState(null);

Then modify your render code:

return (
  <div>
    {/* Only render once the data has loaded */}
    {nutritionData && (
      <Nutrition 
        calories={nutritionData.ENERC_KCAL} 
        carbs={nutritionData.CHOCDF} 
      />
    )}
  </div>
);

Bonus: Add Robust Error Handling

To avoid crashes if the API response doesn't match your expected structure, add error handling to the fetch call:

const getNutrition = async () => { 
  try {
    const response = await fetch(`https://api.edamam.com/api/food-database/parser?nutrition-type=logging&ingr=red%20apple&app_id=${APP_ID}&app_key=${APP_KEY}`);
    const data = await response.json(); 

    // Verify the nutrient data exists before updating state
    if (data.hints?.[0]?.food?.nutrients) {
      setNutrition(data.hints[0].food.nutrients); 
    } else {
      console.error("Nutrient data not found in API response");
    }
  } catch (error) {
    console.error("Failed to fetch nutrition data:", error);
  }
}; 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:08:25