Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.09.2019, 20:20
Аватар для komplekt_17
Аспирант
Отправить личное сообщение для komplekt_17 Посмотреть профиль Найти все сообщения от komplekt_17
 
Регистрация: 14.01.2017
Сообщений: 46

Как получить новый массив после сравнения 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']
Ответить с цитированием
  #2 (permalink)  
Старый 04.09.2019, 20:22
Аватар для komplekt_17
Аспирант
Отправить личное сообщение для komplekt_17 Посмотреть профиль Найти все сообщения от komplekt_17
 
Регистрация: 14.01.2017
Сообщений: 46

Попробовал такой вариант
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;
}

Результат получился правильный, но решение какое-то кривоватое
Ответить с цитированием
  #3 (permalink)  
Старый 04.09.2019, 21:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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)
Ответить с цитированием
  #4 (permalink)  
Старый 04.09.2019, 21:18
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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;
  });
}
Ответить с цитированием
  #5 (permalink)  
Старый 04.09.2019, 22:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068


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)
Ответить с цитированием
  #6 (permalink)  
Старый 05.09.2019, 13:02
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function getPagesArr(pages, categories) {
  return pages.map(p=>{
     var x = categories.find(c => c._id == p.ctgrId);
     x && (p.ctgrId = x.catClass);
     return p;
   });
 }
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить исходный код страницы после ajax lerneree AJAX и COMET 4 28.05.2018 13:53
Как передать в массив перемеенную как ключ массива? фдуч Общие вопросы Javascript 15 11.01.2018 21:21
Как получить свойсвто объекта? Armen Общие вопросы Javascript 4 19.10.2014 06:45
Как получить размер блока сразу после изменения его содержимого? Cooskon Events/DOM/Window 6 17.09.2010 16:15
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30