如何解决有没有办法停止覆盖对象值?
我正在尝试从美国农业部食品数据中心 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 举报,一经查实,本站将立刻删除。