微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法停止覆盖对象值?

如何解决有没有办法停止覆盖对象值?

我正在尝试从美国农业部食品数据中心 api 中提取信息。具体来说,我想提取在“营养”和“数量”下找到的“名称”。提取的信息显示在以下代码段中:

输入-报告[item.fdcId]

1588171: Array(9)
0:
  amount: 93.33
  foodNutrientDerivation: {id: 70,code: "LCCS",description: "Calculated from value per serving size 
                           measure",foodNutrientSource: {…}}
  id: 20460285
  nutrient: {id: 1004,number: "204",name: "Total lipid (fat)",rank: 800,unitName: "g"}
  type: "FoodNutrient"
  __proto__: Object

输出

{undefined: {…}}
undefined: {name: "Fatty acids,total saturated",amount: 13.33,unit: undefined}
__proto__: Object

我有一个空对象,我将它传递给一个函数,该函数用必要的数据填充该对象。我的下一步是在这个对象上使用 Object.keys() 并映射项目。以下是我尝试这样做的方法

FillNutrients = (nutrients,foodNutrients,servings) => {
foodNutrients.forEach(nutrient => {
  let {name,amount,unitName} = nutrient;
  if(nutrients[name]){
    nutrients[name].name = name;
    nutrients[name].amount = amount;
    nutrients[name].unitName = unitName;
  }
  else{
    nutrients[name] = {
      name,unitName
    }
  }
})
return nutrients

}

  CalculateNutritionInfo = () => {
let meals = ["Breakfast","Lunch","Dinner","Snacks"]
let {reports} = this.state;
let nutrients = {};
meals.forEach(meal => {
  this.state[meal].forEach(item => {
    nutrients = this.FillNutrients(nutrients,reports[item.fdcId],item.servings);
  })
})
let nutrientList = Object.keys(nutrients).map(item => nutrients[item]);
let empty = nutrientList.length === 0 ? true : false;
this.setState({
  calories: empty ? 0: nutrients['Energy'].amount,protein: empty ? 0: nutrients['Protein'].value,fat: empty ? 0: nutrients['Total lipid (fat)'].value,carbs: empty? 0: nutrients['Carbohydrate,by difference'].value,nutrientList
})

}

我相信我的问题出在 FillNutrients 函数中,因为在映射时,名称返回为未定义,并且只返回一种营养素。这始终是从 api 获取的数组的最后一个元素。关于我可能出错的地方有什么建议吗?

解决方法

您是否尝试过使用 Object.writable 属性:

const obj = {};
Object.defineProperty(obj,'prop',{
    value: 'test',writable: false
});

console.log(obj.prop);

obj.prop = "test 2";

console.log(obj.prop);

,

您可以测试以下内容。

const foodData = [
  {
    amount: 1000,nutrient: {
      id: 1001,number: "201",name: "One lipid (fat)",rank: 100,unitName: "g"
    }
  },{
    amount: 7000,{
    amount: 2000,nutrient: {
      id: 1002,number: "202",name: "Two lipid (fat)",rank: 200,{
    amount: 3000,nutrient: {
      id: 1003,number: "203",name: "Three lipid (fat)",rank: 300,{
    amount: 4000,nutrient: {
      id: 1004,number: "204",name: "Four lipid (fat)",rank: 400,unitName: "g"
    }
  }
];

const mappedData = foodData.reduce((acc,cur) => {
  if (acc[cur.nutrient.name]) {
    return {
      ...acc,[cur.nutrient.name]: {
        name: cur.nutrient.name,amount: acc[cur.nutrient.name].amount +  cur.amount,unitName:  cur.nutrient.unitName
      },}
  } else {
    return {
      ...acc,amount: cur.amount,unitName: cur.nutrient.unitName
      },}
  }
},{});

console.log('mappedData',mappedData);

Expected Output: {
  "One lipid (fat)": {
    "name": "One lipid (fat)","amount": 8000,"unitName": "g"
  },"Two lipid (fat)": {
    "name": "Two lipid (fat)","amount": 2000,"Three lipid (fat)": {
    "name": "Three lipid (fat)","amount": 3000,"Four lipid (fat)": {
    "name": "Four lipid (fat)","amount": 4000,"unitName": "g"
  }
} 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。