将Firebase元素映射为数组

时间:2018-06-05 09:32:37

标签: javascript arrays reactjs

我正在开发一个Pool投注应用程序。一切看起来都很好,我完成了最后一个模块。

在firebase中,我有一个POOL的赌注,有很多用户。任何用户在比赛中投注都有很多比赛。像这样:

enter image description here

当我在firebase上发出这样的请求时:

 fetchPoolData = async () => {
    const { firebaseApp } = this.props;

    await firebaseApp
      .database()
      .ref(`/pools/${this.props.location.state.pool.key}/users`)
      .once("value")
      .then(snapshot => {
        this.setState({
          poolData: this.snapshotToArray(snapshot),
          isLoadingPool: false
        });
      });
  };

一切看起来都很棒。现在我有一个用户数组,并希望进行一些计算以获得每个用户在每场比赛中所做的积分。所以我像这样映射用户:

this.props.poolData.map(user => {
  allUserMatches.push(calculatePoints(user.matches, outcomeMatches));
});

这里的问题是user.matches不是作为数组检索的。相反,它像一个大的json对象,我可以映射并使我的数学计算点。

enter image description here

如何映射此元素?如果我做一个Object.keys,我只得到一个像这样的对象:

Object.keys(user.matches)
(66) ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "result", "topscorer"

如果我做一个Object.entries,它仍然不是很有用(因为我需要对数组的对象进行查找,以获取由对象的属性过滤的元素)。

Object.entries(user.matches)
(66) [Array(2), Array(2), Array(2), Array(2)
我失去了这里。该怎么办?

2 个答案:

答案 0 :(得分:1)

如果您想使用此类映射,可以使用

Object.keys(user.matches).map(key => user.matches[key])

上面将返回每个对象的键,稍后可以通过键在对象图中使用。 它也没有作为数组返回,因为你有两个不像数组索引那样工作的野性属性(结果和topscorer)所以它需要将它们作为Object而不是数组返回

从该键值对中检索没有结果和topscorer的所有值的方法

Object.keys(user.matches).filter(key => Number.isInteger(parseInt(key))).map(key => user.matches[key]). 

答案 1 :(得分:0)

这会将带有数字索引(类型字符串)的对象转换为您想要的数组:

Object.keys(user.matches).reduce((arr, key) => {
  arr[parseInt(key)] = user.matches[key]
  return arr
}, [])