我正在编写一个接收以下json的云函数

{
    "data":{
        "preference1" : "Food",
        "preference2" : "Travel",
        "preference3" : "Fashion"
}


用户从10个首选项列表中选择了前3个首选项,我想实现计数器,这样我就可以跟踪选择最多的那个。

我正在考虑以这样的方式来实现计数器:我将声明变量,然后执行一系列if语句来添加+1(如果它与字符串匹配)。

var food = 0
var travel = 0
var fashion = 0
if (data.preference1 == 'Food') {
  var food = 1
}
if (data.preference1 == 'Travel') {
  var travel = 1
}


... 等等。

最终做...

countDoc.ref.update({
  food_count: countDoc.ref.data().food_count + food,
  travel_count: countDoc.ref.data().travel_count + travel,
  fashion_count: countDoc.ref.data().fashion_count + fashion
})


这将使我获得理想的结果,但是我知道必须有一种更干净的方法来做到这一点。我不知道确切如何搜索此问题或尝试哪种方法。

如果我能指出正确的方向,那就太好了。

谢谢。

最佳答案

您可以使用地图:

const map = new Map()

// For each data item
Object.values(data).forEach((preference) => {
  const count = (map.get(preference) || 0) + 1
  map.set(preference, count)
})


假设您有一组数据项:

const items = [
  {
    preference1: 'Food',
    preference2: 'Travel',
    preference3: 'Fashion',
  },
  {
    preference1: 'Something',
    preference2: 'Travel',
    preference3: 'Fashion',
  },
  {
    preference1: 'Food',
    preference2: 'Something Else',
    preference3: 'Fashion',
  },
]

const map = new Map()

// For each data item
items.forEach((item) => {
  Object.values(item).forEach((preference) => {
    const count = (map.get(preference) || 0) + 1
    map.set(preference, count)
  })
})

console.log(map)


输出:

Map {
  'Food' => 2,
  'Travel' => 2,
  'Fashion' => 3,
  'Something' => 1,
  'Something Else' => 1 }

07-26 09:27