Замена идентификатора в массиве именем из второго массива - PullRequest
0 голосов
/ 26 мая 2019

У меня есть проблема с соединением двух массивов с объектами на id и заменой этого id на NAME из второго массива.Например, у меня есть массивы:

array1 = [
  {id: [1, 2], info: "xxx"},
  {id: [2, 3], info: "yyy"}
]

array2 = [
  {nameId: 1, name: "Miami"},
  {nameId: 2, name: "Wacanda"},
  {nameId: 3, name: "London"},
]

И я хочу изменить array1 или создать новый array3 как (с использованием ES6):

array1 = [
  {id: ["Miami", "Wacanda"], info: "xxx"},
  {id: ["Wacanda", "London"], info: "yyy"}
]

или

array3 = [
  {name: ["Miami", "Wacanda"], info: "xxx"},
  {name: ["Wacanda", "London"], info: "yyy"}
]

Ссылка для быстрого редактирования: https://stackblitz.com/edit/angular-lrnfrd?file=src%2Fapp%2Ftesting%2Ftesting.component.ts

Ответы [ 3 ]

1 голос
/ 26 мая 2019

Одним из возможных решений является создание Map между ids и names из array2 с использованием Array.reduce () .Затем вы можете использовать Array.map () поверх array1, чтобы получить нужные данные.Обратите внимание, что в следующем примере я выбрал ваш второй пример вывода.

const array1 = [
  {id: [1, 2], info: "xxx"},
  {id: [2, 3], info: "yyy"}
];

const array2 = [
  {nameId: 1, name: "Miami"},
  {nameId: 2, name: "Wacanda"},
  {nameId: 3, name: "London"},
];

let nameFromId = array2.reduce(
    (acc, {nameId, name}) => (acc.set(nameId, name), acc),
    new Map()
);

let res = array1.map(({id, info}) => ({name: id.map(i => nameFromId.get(i)), info}));

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Другой альтернативой без генерации Map является использование Array.find () внутри функции map():

let res = array1.map(
  ({id, info}) => ({name: id.map(i => array2.find(o => o.nameId === i).name), info})
);
0 голосов
/ 26 мая 2019

Это сгенерирует ваш второй пример:

var array3 = array1.map(({ id, info }) => ({
    name: array2.filter(({ nameId }) => id.includes(nameId)).map(({ name }) => name),
    info
}));

Сначала он фильтрует nameId в списке идентификаторов из array1, затем запускает map, чтобы просто вернуть имя. Ожидаемый результат становится:

[
    {"name":["Miami","Wacanda"],"info":"xxx"},
    {"name":["Wacanda","London"],"info":"yyy"}
]
0 голосов
/ 26 мая 2019

Действительно просто - просто используйте вложенные map с find:

const array1 = [{id:[1,2],info:"xxx"},{id:[2,3],info:"yyy"}];
const array2 = [{nameId:1,name:"Miami"},{nameId:2,name:"Wacanda"},{nameId:3,name:"London"}];
const array3 = array1.map(({ id, info }) => ({ name: id.map(e => array2.find(({ nameId }) => nameId == e).name), info }));
console.log(array3);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...