![](/img/trans.png)
[英]Javascript reformat or map an array of objects to a new array of new objects? like reformating it and giving new keys (names) for values
[英]JavaScript shortest way to map an array of objects to a new array of new objects?
我有一个person
对象数组,其中每个person
都有一个由 name 和 image url 组成的profiles
对象数组,以及一个由lat
和long
属性组成的addresses 对象列表,如下所示:
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"}]
}];
我需要创建一个新的对象数组,其中每个新对象对于每组lat
long
都有一个image
、 long
、 lat
属性,如下所示:
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
第一阵列进入第二?
您可以使用嵌套的Array.flatMap()
和Array.map()
来迭代数组/地址/配置文件,并将image
和lat
, long
属性组合到一个对象中:
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()
:
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);
您可以将Array.prototype.reduce()
与Array.prototype.forEach()
结合使用。
reduce()
的文档说明:
reduce() 方法在数组的每个元素上执行一个 reducer 函数(您提供的),从而产生单个输出值。
我认为以下方法对您有用:
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);
我希望这有帮助!
由于您要求编写代码最短:
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);
这是格式和更好的变量名称:
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);
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" }]
}
];
var expectedResult = listOfPersons.reduce(
(acc, person) => ([
...acc,
...person.addresses.map(
address => ({ ...address, image: person.profile[0].image })
)
]),
[]
)
假设您总是想要.profile
的第一个结果,这将为您提供所需的内容
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"}]
}];
var expectedResult = [];
expectedResult.forEach(person => {
person.addresses.forEach(address => expectedResult.push({image: person.profile[0].image, ...address}))
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.