为何Google Places JS客户端库返回NaN,硬编码API URL结果正常?
解决Google Places JavaScript Library返回NaN评分的问题
首先可以明确:Google Places JavaScript客户端库和REST API的查询能力是一致的,你遇到的NaN问题几乎肯定是代码中未处理「部分地点没有用户评分」的情况导致的。
问题根源分析
你的回调函数gymCallback中直接累加place.rating,但注意:并不是所有Google Places数据库中的地点都有用户提交的评分——当某个地点没有评分时,place.rating属性会是undefined。把undefined和数字相加,totalRating会直接变成NaN,后续的平均值计算自然也会得到NaN。
而你直接访问REST API的XML结果时,可能只关注了有评分的条目,忽略了那些没有<rating>标签的地点;或者刚好那次请求返回的所有健身房都有评分,所以没发现这个问题。
修复代码
修改你的回调函数,只累加存在rating属性的地点评分,同时统计有效评分的数量(而不是直接用结果集的总长度):
function gymCallback(results2, status2){ // 先检查请求状态是否成功 if (status2 !== google.maps.places.PlacesServiceStatus.OK) { console.error('获取健身房数据失败:', status2); document.getElementById('gymAvgRating').value = '0.0'; return; } var totalRating = 0; var ratedPlaceCount = 0; results2.forEach( function( place ) { // 只处理有rating属性的地点 if (place.rating !== undefined) { totalRating += place.rating; ratedPlaceCount++; } }); // 计算平均评分:如果没有有评分的地点,返回0.0 var averageRating = ratedPlaceCount === 0 ? 0 : totalRating / ratedPlaceCount; var averageRatingRounded = averageRating.toFixed(1); var averageGymRatingTB = document.getElementById('gymAvgRating'); averageGymRatingTB.value = averageRatingRounded; }
额外排查建议
- 在回调函数开头添加
console.log(results2),查看返回的每个place对象的具体属性,确认哪些地点没有rating字段,这能帮你更直观地理解问题。 - 注意
nearbySearch的结果数量是有限制的(默认最多返回20条),如果某个区域的目标设施大多没有评分,就会出现你看到的NaN情况;而另一个区域可能刚好有评分的设施占比高,所以能得到正常结果。
内容的提问来源于stack exchange,提问作者user9269133
相关产品推荐
相关产品推荐

