繁体   English   中英

使用 reduce 转换数组(属性未定义)

[英]Transform array using reduce (property undefined)

我想转换一个数组以重新组合同一个国家的所有城市。 我有一组 Object

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数组的 object:

 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);

您可以创建一个以国家/地区为键的 Map,并以初始空数组作为对应值。 然后填充那些 arrays,最后从 Map 中提取条目。 这具有线性时间复杂度:

 let locations = [{cities: ["Paris"],country: "France"},{cities: ["Marseille"],country: "France"},{cities: ["Kiev"],country: "Ukraine"},{cities: ["Odesa"], country: "Ukraine"}]; let map = new Map(locations.map(({country}) => [country, {country, cities: []}])); for (let loc of locations) map.get(loc.country).cities.push(...loc.cities); let res = Array.from(map.values()); console.log(res);

我认为要实现所需的 output 格式,您可以执行以下操作:

 locations = [ { cities: ["Paris"], country: "France" }, { cities: ["Marseille"], country: "France" }, { cities: ["Kiev"], country: "Ukraine" }, { cities: ["Odesa"], country: "Ukraine" } ]; var grouped = Object.entries( locations.reduce((a, {country, cities}) => ({...a, [country]: [...(a[country] || []), ...cities] }), {}) ).map(([country, cities]) => ({ country: country, cities: cities }), []); console.log(grouped);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM