JavaScript кратчайший способ сопоставить массив объектов с новым массивом новых объектов? - PullRequest
2 голосов
/ 07 января 2020

У меня есть массив person объектов, где каждый person имеет массив profiles объектов, которые состоят из имени и URL-адреса изображения, и список объектов адресов, которые состоят из lat и long свойства, как указано ниже:

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"}]
}];

Мне нужно создать новый массив объектов, где каждый новый объект имеет свойства image, long, lat, для каждый набор lat long, как указано ниже:

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 первый массив во второй?

Ответы [ 5 ]

3 голосов
/ 07 января 2020

Вы можете использовать вложенные 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);

Если вы всегда всегда используете только 1-й профиль, вы можете удалить один уровень 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);
2 голосов
/ 07 января 2020

Заявлено, что вы попросили самый короткий в написании код:

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);
2 голосов
/ 07 января 2020

Вы можете использовать Array.prototype.reduce() вместе с Array.prototype.forEach().

В документации указано: reduce():

Метод redu () выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.

Я думаю, что следующее может работать для вас:

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

Надеюсь, это поможет!

1 голос
/ 07 января 2020
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

0 голосов
/ 07 января 2020
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}))
});
...