首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript将对象数组映射到新对象数组的最短方式?

JavaScript将对象数组映射到新对象数组的最短方式?
EN

Stack Overflow用户
提问于 2020-01-07 15:19:57
回答 5查看 533关注 0票数 2

我有一个person对象数组,其中每个person都有一个由名称和图像url组成的profiles对象数组,以及一个由latlong属性组成的addresses对象列表,如下所示:

代码语言:javascript
复制
var listOfPersons = [{
    addresses : [{lat:11, long:11}, {lat:22, long:22}],
    profile: [{image:"some_url1", name: "peter parker"}]
},
{
    addresses : [{lat:33, long:33}, {lat:44, long:44}],
    profile: [{image:"some_url2", name: "bruce wayne"}]
}];

我需要创建一个新的对象数组,其中每个新对象都有一个imagelonglat属性,用于lat long,如下所示:

代码语言:javascript
复制
var expectedResult = [
{
    image:"some_url1",
  lat:11,
  long:11
},
{
    image:"some_url1",
  lat:22,
  long:22
},
{
    image:"some_url1",
  lat:33,
  long:33
},
{
    image:"some_url1",
  lat:44,
  long:44
}
];

将第一个数组转换为第二个数组的map\ reduce的最短方式(就编写代码而言)是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-01-07 15:26:45

您可以使用嵌套Array.flatMap()Array.map()来迭代数组/地址/概要文件,并将imagelatlong属性组合到一个对象中:

代码语言:javascript
复制
const listOfPersons = [{"addresses":[{"lat":11,"long":11},{"lat":22,"long":22}],"profile":[{"image":"some_url1","name":"peter parker"}]},{"addresses":[{"lat":33,"long":33},{"lat":44,"long":44}],"profile":[{"image":"some_url2","name":"bruce wayne"}]}];

const result = listOfPersons.flatMap(o =>
  o.addresses.flatMap(({ lat, long }) => 
    o.profile.map(({ image }) => ({
      image,
      lat,
      long
    }))
  )
);

console.log(result);

如果始终只使用第一个配置文件,则可以删除一个级别的Array.flatMap()

代码语言:javascript
复制
const listOfPersons = [{"addresses":[{"lat":11,"long":11},{"lat":22,"long":22}],"profile":[{"image":"some_url1","name":"peter parker"}]},{"addresses":[{"lat":33,"long":33},{"lat":44,"long":44}],"profile":[{"image":"some_url2","name":"bruce wayne"}]}];

const result = listOfPersons.flatMap(o =>
  o.addresses.map(({ lat, long }) =>  ({
    image: o.profile[0].image,
    lat,
    long
  }))
);

console.log(result);

票数 3
EN

Stack Overflow用户

发布于 2020-01-07 15:24:16

您可以将Array.prototype.reduce()与组合Array.prototype.forEach()结合使用。

reduce()的文档状态

()方法对数组的每个元素执行约简函数(您提供的),从而得到一个单一的输出值。

我认为以下几点对你是有用的:

代码语言:javascript
复制
const listOfPersons = [{
    addresses : [{lat:11, long:11}, {lat:22, long:22}],
    profile: [{image:"some_url1", name: "peter parker"}]
},
{
    addresses : [{lat:33, long:33}, {lat:44, long:44}],
    profile: [{image:"some_url2", name: "bruce wayne"}]
}];

const result = listOfPersons.reduce((acc, cur) => {
  cur.addresses.forEach(e => acc.push({ ...e, image: cur.profile[0].image }));   
  return acc;
}, []);

console.log(result);

我希望这能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2020-01-07 15:31:53

既然您在编写代码时要求最短:

代码语言:javascript
复制
var listOfPersons = [{addresses: [{lat:11, long:11}, {lat:22, long:22}],profile: [{image:"some_url1", name: "peter parker"}]},{addresses:lat:33, long:33}, {lat:44, long:44}],profile: [{image:"some_url2", name: "bruce wayne"}]}];

const res = listOfPersons.reduce((r,{addresses:a,profile:[{image}]})=> [...r,...a.map(o=>({image,...o}))],[]);

console.log(res);

这里有格式和更好的变量名:

代码语言:javascript
复制
var listOfPersons = [{
  addresses : [{lat:11, long:11}, {lat:22, long:22}],
  profile: [{image:"some_url1", name: "peter parker"}]
},
{
  addresses : [{lat:33, long:33}, {lat:44, long:44}],
  profile: [{image:"some_url2", name: "bruce wayne"}]
}];


const res = listOfPersons.reduce((acc, { addresses: adr, profile: [{image}] }) =>
  [...acc, ...adr.map(a => ({image, ...a}) )],
[]);


console.log(res);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59631246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档