【问题标题】:How to calculate object values from 2 different APIS?如何从 2 个不同的 APIS 计算对象值?
【发布时间】:2021-03-18 04:27:59
【问题描述】:

我正在使用 2 个 APIS 来访问食品营养数据,一个用于生食数据,另一个用于包装食品的条码扫描。

问题是每个都有自己的数据结构,这里有一个例子和从食物中获取卡路里的路径。

API A: .foodNutrients[2].value = 52

foodNutrients: Array(15)[
       {nutrientId: 1087, nutrientName: "Calcium, Ca", unitName: "MG",value:0},
       {nutrientId: 1093, nutrientName: "Sodium, Na", unitName: "MG",value:0},
       {nutrientId: 1008, nutrientName: "Energy", unitName: "KCAL",value:52}
    ]

API B: .nutriments["energy-kcal_100g"] = 492

  nutriments = {
    calcium_100g: 0.076,
    sodium_100g: 0.196
    energy-kcal_100g: 492,
  }

我的目标是能够从两个 APIS 添加项目并能够执行计算,例如计算总卡路里、蛋白质等。

我已经将我的应用设置为基于 API A 呈现数据,那么我是否要以某种方式转换 API B 数据,还是有其他解决方案?

【问题讨论】:

  • 编写一个函数,该函数返回一个一致的营养对象,而不考虑 API。老实说,我不确定您要问什么,这里没有神奇的捷径,但这不是一个无法解决的问题,甚至不是一个困难的问题。将 B 转换为 A 是一个有效的解决方案,但同样,我看不出会有什么问题。

标签: javascript arrays database function object


【解决方案1】:

由于 API A 中的数据结构看起来更好,我会将 api B 转换为使用类似的数据结构。如果api B键命名一致,可以从'_'开始拆分

[{
  nutrientId: 123,
  nutrientName: "calcium",
  unitname: "100g",
  value: 0.076
}]

然后将其映射到类似的东西

[{
  nutrientId: 123,
  nutrientName: calcium,
  unitname: "kg",
  value: 0.76
}]

【讨论】:

    【解决方案2】:

    您必须遍历其中一个,同时检查它们是否共享一个通用名称。 你可以这样做:

    for (x in nutriments) {
        let food = foodNutrients.find(y => y.nutrientName.toLowerCase().includes(x.substr(0,4).toLowerCase()));
        if (food) { 
          food.newValue = nutriments[x]   
        }
        
    }
    

    这将输出:

    0: {nutrientId: 1087, nutrientName: "Calcium, Ca", unitName: "MG", value: 0, newValue: 0.076}
    1: {nutrientId: 1093, nutrientName: "Sodium, Na", unitName: "MG", value: 0, newValue: 0.196}
    2: {nutrientId: 1008, nutrientName: "Energy", unitName: "KCAL", value: 52, newValue: 492}
    

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2021-08-09
      • 2021-02-24
      • 1970-01-01
      • 2013-07-29
      • 2015-08-24
      相关资源
      最近更新 更多