Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как получить новый массив после сравнения 2-х исходных (https://javascript.ru/forum/misc/78380-kak-poluchit-novyjj-massiv-posle-sravneniya-2-kh-iskhodnykh.html)

komplekt_17 04.09.2019 20:20

Как получить новый массив после сравнения 2-х исходных
 
Всем Доброго времени года.
Дано 2 массива объектов(pages[] и categories[]). Нужно перебрав элементы массива и свойств каждого из объектов, получить новый массив с изменёнными свойствами объектов в нём:
Делаю так:
categories: [{_id:'5d636c50349128976d09806a',catName:'Banking',catClass:'banking',userId:''}, 
{_id:'5d636c50349128976d09806b',catName: 'Torrents', catClass: 'torrents', userId:''}, 
{_id:'5d636c50349128976d09806c',catName: 'AudioBooks', catClass: 'audiobooks', userId:''}];

pages: [
{id: 0, name: 'N-0', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 1, name: 'N-1', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 2, name: 'N-2', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 3, name: 'N-3', link: '', ctgrId: '5d636c50349128976d09806c',userId: '',screen:''}]

const getPagesArr = (pages, categories) =>{
	for(var i=0; i <= pages.length; i++){
		for(var j=0; j <= categories.length; j++){
			for(var kk in pages[i]){
				for(var dd in categories[j]){
					if(pages[i][kk] === categories[j][dd]){
						pages[i]['ctgrId'] = categories[j]['catClass']
					}
				}
			}
		}
	}
	return pages;
}

const newArray = getPagesArr(pages, categories);

Должен получиться новый массив pages, в котором у объектов со свойством ctgrId должно быть значение объектов catClass из categories, при совпадении свойств pages[i]['ctgrId'] === categories[j]['_id']

komplekt_17 04.09.2019 20:22

Попробовал такой вариант
const getPagesArr = (pages, categories) =>{
	for(var i=0; i <= pages.length; i++){
		for(var j=0; j <= categories.length; j++){
			for(var kk in pages[i]){
				for(var dd in categories[j]){
					if(pages[i]['ctgrId'] === categories[j]['_id']){
						pages[i]['ctgrId'] = categories[j]['catClass']
					}
				}
			}
		}
	}
	return pages;
}

Результат получился правильный, но решение какое-то кривоватое

рони 04.09.2019 21:13

komplekt_17,
не для ie!
categories = [{_id:'5d636c50349128976d09806a',catName:'Banking',catClass:'banking',userId:''},
{_id:'5d636c50349128976d09806b',catName: 'Torrents', catClass: 'torrents', userId:''},
{_id:'5d636c50349128976d09806c',catName: 'AudioBooks', catClass: 'audiobooks', userId:''}];

pages = [
{id: 0, name: 'N-0', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 1, name: 'N-1', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 2, name: 'N-2', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 3, name: 'N-3', link: '', ctgrId: '5d636c50349128976d09806c',userId: '',screen:''}]

const getPagesArr = (pages, categories) =>{
    const obj = Object.fromEntries(categories.map(({_id, catClass})=> [_id, catClass]));
    pages.forEach( el => {
    const {ctgrId} = el;
    ctgrId in obj && (el.ctgrId = obj[ctgrId])
   })
	return pages;
}
const newArray = getPagesArr(pages, categories);
console.log(newArray)

Alexandroppolus 04.09.2019 21:18

function getPagesArr(pages, categories) {
  var map = categories.reduce((m, c) => (m.set(c._id, c.catClass), m), new Map());
  return pages.map((p) => {
    var v = Object.assign({}, p);
    v.ctgrId = map.get(p.ctgrId) || p.ctgrId;
    return v;
  });
}

рони 04.09.2019 22:29

:) :write:
const categories = [{_id:'5d636c50349128976d09806a',catName:'Banking',catClass:'banking',userId:''},
{_id:'5d636c50349128976d09806b',catName: 'Torrents', catClass: 'torrents', userId:''},
{_id:'5d636c50349128976d09806c',catName: 'AudioBooks', catClass: 'audiobooks', userId:''}];

const pages = [
{id: 0, name: 'N-0', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 1, name: 'N-1', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 2, name: 'N-2', link: '', ctgrId: '5d636c50349128976d09806a',userId: '',screen:''},
{id: 3, name: 'N-3', link: '', ctgrId: '5d636c50349128976d09806c',userId: '',screen:''}]

function getPagesArr(pages, categories) {
  var map = categories.reduce((m, {_id, catClass}) => ({[_id] : catClass, ...m}), {});
  return pages.map( p => {
    var v = {...p, ctgrId : map[p.ctgrId] || p.ctgrId};
    return v;
  });
}

const newArray = getPagesArr(pages, categories);
console.log(newArray)

j0hnik 05.09.2019 13:02

function getPagesArr(pages, categories) {
  return pages.map(p=>{
     var x = categories.find(c => c._id == p.ctgrId);
     x && (p.ctgrId = x.catClass);
     return p;
   });
 }


Часовой пояс GMT +3, время: 19:25.