将 Firebase 元素映射为数组
Mapping Firebase element as array
我正在开发台球投注应用程序。一切看起来都不错,我正在完成最后一个模块。
在 firebase 中,我有很多用户的赌注。任何用户都有很多场比赛,他们对比赛进行了投注。像这样:
当我像这样在 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 对象,我可以映射它并进行数学计算来计算点。
如何映射此元素?如果我执行 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)
我迷路了。该怎么办?
如果你想使用这样的映射,你可以选择
Object.keys(user.matches).map(key => user.matches[key])
上面将 return 您来自每个对象的键,稍后可以通过它们的键在对象映射中使用。
它也不会 return 作为数组,因为你有两个不像数组索引那样工作的野生属性(结果和 topscorer)所以它需要 return 它们作为对象而不是数组
一种从该键值对中检索没有结果和最佳射手的所有值的方法
Object.keys(user.matches).filter(key => Number.isInteger(parseInt(key))).map(key => user.matches[key]).
这会将带有数字索引(字符串类型)的对象转换为您想要的数组:
Object.keys(user.matches).reduce((arr, key) => {
arr[parseInt(key)] = user.matches[key]
return arr
}, [])
我正在开发台球投注应用程序。一切看起来都不错,我正在完成最后一个模块。
在 firebase 中,我有很多用户的赌注。任何用户都有很多场比赛,他们对比赛进行了投注。像这样:
当我像这样在 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 对象,我可以映射它并进行数学计算来计算点。
如何映射此元素?如果我执行 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)
我迷路了。该怎么办?
如果你想使用这样的映射,你可以选择
Object.keys(user.matches).map(key => user.matches[key])
上面将 return 您来自每个对象的键,稍后可以通过它们的键在对象映射中使用。 它也不会 return 作为数组,因为你有两个不像数组索引那样工作的野生属性(结果和 topscorer)所以它需要 return 它们作为对象而不是数组
一种从该键值对中检索没有结果和最佳射手的所有值的方法
Object.keys(user.matches).filter(key => Number.isInteger(parseInt(key))).map(key => user.matches[key]).
这会将带有数字索引(字符串类型)的对象转换为您想要的数组:
Object.keys(user.matches).reduce((arr, key) => {
arr[parseInt(key)] = user.matches[key]
return arr
}, [])