Создание нового массива путем объединения массива объектов на основе некоторых условий - PullRequest
0 голосов
/ 08 мая 2020

У меня есть два массива объектов.

const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:A},
{id:2,text:'text2',type:B},
{id:3,text:'text3',type:C},
{id:4,text:'text4',type:D},
{id:5,text:'text5',type:D},
{id:6,text:'text6',type:E},
{id:7,text:'text7',type:E},
{id:8,text:'text8',type:B},
]

Есть некоторые типы, которые находятся в array1, но не в массиве 2. Я хочу отобразить newArray следующим образом: -

const newArray=[
{id:1,text:'text1',type:A,name:'word1'},
{id:2,text:'text2',type:B,name:'word2'},
{id:3,text:'text3',type:C,name:'word3'},
{id:4,text:'text4',type:D,name:'word4'},
{id:5,text:'text5',type:D,name:'word4'},
{id:6,text:'text6',type:E,name:'word5'},
{id:7,text:'text7',type:E,name:'word5'},
{id:8,text:'text8',type:B,name:'word2'},
]

Я пробовал это сделать: -

var newArray=[],
newArray=array1.map(x => Object.assign(x, array2.filter(y => y.type == x.type)));

Но я не получаю вывод в требуемой форме.

Ответы [ 6 ]

1 голос
/ 08 мая 2020

Прежде всего ваш type в array2 должен быть string. В противном случае он должен ссылаться на переменную.

И в качестве i вы используете методы map и find массива. Вы можете улучшить свое решение следующим образом:

const newArr = array2.map(x => ({...x, name: array1.find(y => y.type === x.type).name }));
0 голосов
/ 08 мая 2020

Вот моя попытка с forEach l oop.

var array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

var array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]

array2.forEach((v)=>{
    type=array1.find(({type})=>type==v.type);
    v = Object.assign(v, type);
});

console.log(array2);
0 голосов
/ 08 мая 2020

Вы должны сопоставить array2, чтобы вернуть новый массив объектов на основе ключевого сравнения type между двумя массивами, например:

const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]

const newArray = array2.map(x => Object.assign(x, {name: array1.find(y => y.type == x.type).name}));

console.log(newArray)//test
0 голосов
/ 08 мая 2020

Наиболее эффективным способом было бы создать карту объекта из массива Array1, чтобы вы могли выполнять поиск в постоянное время. Опубликуйте, что вы можете сопоставить массив и вернуть обновленное возражение, используя синтаксис распространения

const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]


const map = Object.assign({}, ...array1.map(item => ({[item.type]: item.name})))

const res = array2.map(obj => ({
   ...obj,
   name: map[obj.type]
}))

console.log(res);
0 голосов
/ 08 мая 2020

попробуйте:

const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]

const a = array2.map(arr => {
    const {name} = array1.filter(iArr => iArr.type === arr.type)[0];
    return {...arr, name} 
})
0 голосов
/ 08 мая 2020

Вы можете преобразовать array1 в Map, который привязан к типу и сохраняет name для своих значений. Затем вы можете .map() свой array2, чтобы добавить свойство name к каждому объекту на основе связанного значения из Map

const array1 = [ {type:'A',name:'word1'}, {type:'B',name:'word2'}, {type:'C',name:'word3'}, {type:'D',name:'word4'}, {type:'E',name:'word5'}, {type:'F',name:'word6'},];
const array2 = [ {id:1,text:'text1',type:'A'}, {id:2,text:'text2',type:'B'}, {id:3,text:'text3',type:'C'}, {id:4,text:'text4',type:'D'}, {id:5,text:'text5',type:'D'}, {id:6,text:'text6',type:'E'}, {id:7,text:'text7',type:'E'}, {id:8,text:'text8',type:'B'}, ];

const typeMap = new Map(array1.map(({type, name}) => [type, name]));
const newArr = array2.map(o => ({...o, name: typeMap.get(o.type)}));
console.log(newArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...