javascript - 使用 reduce 转换数组(属性未定义)
问题描述
我想转换一个数组以重新组合同一个国家的所有城市。我有一个对象数组
locations = [
{
cities: ["Paris"]
country: "France"
},
{
cities: ["Marseille"]
country: "France"
},
{
cities: ["Kiev"]
country: "Ukraine"
},
{
cities: ["Odessa"]
country: "Ukraine"
}
...
我想要这个:
locations = [
{
cities: ["Paris", "Marseille"]
country: "France"
},
{
cities: ["Kiev, Odessa"]
country: "Ukraine"
},
...
所以,我的想法是:
locations.reduce((prev, curr) => {
if (prev.country === curr.country) {
prev.cities.push(curr.cities[0])
// and delete curr Object
}
})
对于第一对等于国家/地区,curr.cities[0] 被推送到 prev.cities,但不会用于下一次迭代:TypeError: Cannot read property 'country' of undefined
[![console.log(locations) - TypeError: Cannot read property 'country' of undefined][1]][1]
解决方案
使用时reduce
,需要返回prev
以供下一次迭代使用,同时初始化为{}
。此外,您需要注意每个国家/地区的初始添加,其中cities
应存储带有数组的对象:
const locations = [
{ country: "France", cities: ['city1','city2'] },
{ country: "France", cities: ['city3','city4'] },
{ country: "Ukraine", cities: ['city5'] },
{ country: "Ukraine", cities: ['city6'] }
];
const res = Object.values(locations.reduce((prev, curr) => {
const { country, cities = [] } = curr;
const [city] = cities;
if (prev[country] && city) {
prev[country].cities.push(city);
} else {
prev[country] = { country, cities: city ? [city] : [] };
}
return prev;
}, {}));
console.log(res);
推荐阅读
- c++ - 从模板指针有什么好的解决方案:*(T*) 到 C++ 类型转换?
- bash - 将 git-log 旧提交者时间戳转换为严格的 ISO 8601 时间戳
- javascript - 如何使用 JavaScript 为每个列表项添加唯一图标
- c++ - 如何使用 QT 从 SVG 文件中获取值
- html - 如何使用内部文本从网页的下拉列表中选择一个选项
- sql-server - 如何在下表中找到对
- c++ - 将 char 数组转换为 uint8_t
- c# - 不断收到“预期标识符”和“预期”错误消息
- java - 如何在 ios 上将 user1 位置跟踪信息推送给用户 2
- php - sql查询相关问题