我正在尝试使用 Google Places API 来获取我所在位置的地名。
返回的数据结构有以下类型:
descriptor1: 'street number' | 'neighborhood' | 'postcode' | 'route' | 'locality' | 'postal_town' | 'administrative_area_level_2' | 'administrative_area_level_1' | 'country'
places: [
{
address_components: [{
long_name: 'string',
short_name: 'string',
types: {
0: descriptor1,
1?: descriptor2
}
}],
other_fields not relevant here
}
]
无法保证任何给定地点将拥有多少地址组件,或者是否有任何地址组件。无法保证哪些类型会被表示,哪些不会被表示。
我想编写返回第一个 address_component 的 long_name 的代码,该地址的字段R.get(R.lensPath('types', '0'))
为'neighborhood'
if one 存在locality
,否则,然后postal_town
,administrative_area_level_2
然后administrative_area_level_1
,然后country
。
所以我从R.pluck('address_components', places)
. 现在我可以构造一个对象,将列表缩减为一个对象,将我感兴趣的每个键中的第一个插入到对象中,然后找到一个值。就像是:
const interestingTypes = ['neighborhood', 'locality', 'postal_town', 'administrative_area 2', 'administrative_area_1', 'country']
const res = R.mergeAll(R.pluck('address_components', places).map((addressComponentList) => addressComponentList.reduce((memo, addressComponent) => {
if (interestingTypes.indexOf(addressComponent.types[0]) !== -1) {
if (!memo[addressComponent.types[0]]) {
memo[addressComponent.types[0]] = addressComponent.long_name
}
}
return memo
},{})))
res[R.find((type) => (Object.keys(res).indexOf(type) !== -1), interestingTypes)]
虽然可以肯定的是,这可以稍微更惯用地替换所有本机.reduce
和.map
with R.map
/R.reduce
这并不能真正解决根本问题。
1) 即使在找到结果之后,这也会遍历列表的每个成员。
2)生成的结构仍然需要迭代(例如使用 find )才能真正找到最紧密的界限。
一个纯函数式的,最好是惰性的实现会是什么样子?Ramda 的哪些功能可以派上用场?我可以以某种方式使用镜头吗?功能构成?还有什么?
map
可以将本机/reduce
与ramda混合和匹配吗?在可能的情况下,本机调用肯定比库调用更好吗?