Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2022, 11:47
Интересующийся
Отправить личное сообщение для Neznajka Посмотреть профиль Найти все сообщения от Neznajka
 
Регистрация: 26.07.2022
Сообщений: 26

Упорядоченная замена свойств в массиве объектов
Есть четыре массива - один основной и три словарных, содержащих подстановочные значения:
var arrayMain=[	{'order':234,'Dat':'23-11','firma':156,'director':45,'zakaz':[{'produkt':34,'sum':5},{'produkt':17,'sum':1},{'produkt':24,'sum':3},{'produkt':19,'sum':5}]},
				{'order':235,'Dat':'24-11','firma':368,'director':12,'zakaz':[{'produkt':17,'sum':2},{'produkt':24,'sum':4},{'produkt':34,'sum':2}]},
				{'order':236,'Dat':'25-11','firma':213,'director':96,'zakaz':[{'produkt':24,'sum':7},{'produkt':34,'sum':2}]}
			  ];
var slovarFirm=[{'kod':156,'name':'Ямал-сервис'},{'kod':213,'name':'Рассвет'},{'kod':368,'name':'ЭлектроСила'}];
var slovarPers=[{'kod':12,'name':'Иванов'},{'kod':45,'name':'Петров'},{'kod':96,'name':'Сидоров'}];
var slovarProd=[{'kod':17,'name':'Бумага'},{'kod':19,'name':'Маркеры'},{'kod':24,'name':'Скрепки'},{'kod':34,'name':'Карандаши'}];

Мне нужно получить результирующий массив через замену в arrayMain кодов фирм, директоров и продуктов наименованиями из соответствующих словарных массивов. Можно ли это сделать поэлегантнее, чем вложенными циклами?
Ответить с цитированием
  #2 (permalink)  
Старый 07.12.2022, 12:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Neznajka,
let arrayMain=[	{'order':234,'Dat':'23-11','firma':156,'director':45,'zakaz':[{'produkt':34,'sum':5},{'produkt':17,'sum':1},{'produkt':24,'sum':3},{'produkt':19,'sum':5}]},
				{'order':235,'Dat':'24-11','firma':368,'director':12,'zakaz':[{'produkt':17,'sum':2},{'produkt':24,'sum':4},{'produkt':34,'sum':2}]},
				{'order':236,'Dat':'25-11','firma':213,'director':96,'zakaz':[{'produkt':24,'sum':7},{'produkt':34,'sum':2}]}
			  ];
let slovarFirm=[{'kod':156,'name':'Ямал-сервис'},{'kod':213,'name':'Рассвет'},{'kod':368,'name':'ЭлектроСила'}];
let slovarPers=[{'kod':12,'name':'Иванов'},{'kod':45,'name':'Петров'},{'kod':96,'name':'Сидоров'}];
let slovarProd=[{'kod':17,'name':'Бумага'},{'kod':19,'name':'Маркеры'},{'kod':24,'name':'Скрепки'},{'kod':34,'name':'Карандаши'}];
        const createObj = arr => arr.reduce((obj, {
            kod,
            name
        }) => (obj[kod] = name, obj), {})
        slovarFirm = createObj(slovarFirm);
        slovarPers = createObj(slovarPers);
        slovarProd = createObj(slovarProd);
        arrayMain = arrayMain.map(ob => {
            let {
                firma,
                director,
                zakaz
            } = ob;
            firma = slovarFirm[firma];
            director = slovarPers[director];
            zakaz.forEach(ob => ob.produkt = slovarProd[ob.produkt]);
            return { ...ob,
                firma,
                director,
                zakaz
            }
        })
        console.log(arrayMain)
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2022, 12:37
Интересующийся
Отправить личное сообщение для Neznajka Посмотреть профиль Найти все сообщения от Neznajka
 
Регистрация: 26.07.2022
Сообщений: 26

To рони:
Большое спасибо! Я делал чисто на forEach'ах, но Ваш код работает заметно быстрее на большом количестве записей (>5000). Правда, Ваш код тут непосредственно на странице почему-то не запускается, зато на https://runjs.co - срабатывает без сучка-задоринки. Спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 07.12.2022, 13:06
Интересующийся
Отправить личное сообщение для Neznajka Посмотреть профиль Найти все сообщения от Neznajka
 
Регистрация: 26.07.2022
Сообщений: 26

Ещё одна просьба, рони - напишите, пожалуйста, как выглядел бы без стрелочных функций вот этот фрагмент
const createObj = arr => arr.reduce((obj, {kod,name}) => (obj[kod] = name, obj), {})

Я сделал промежуточный console.log() и поэтому интуитивно понимаю, что там в конце происходит, но хочу "прочувствовать" каждый шаг процесса
Ответить с цитированием
  #5 (permalink)  
Старый 07.12.2022, 13:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Neznajka,
let arrayMain = [
  {
    order: 234,
    Dat: '23-11',
    firma: 156,
    director: 45,
    zakaz: [
      { produkt: 34, sum: 5 },
      { produkt: 17, sum: 1 },
      { produkt: 24, sum: 3 },
      { produkt: 19, sum: 5 }
    ]
  },
  {
    order: 235,
    Dat: '24-11',
    firma: 368,
    director: 12,
    zakaz: [
      { produkt: 17, sum: 2 },
      { produkt: 24, sum: 4 },
      { produkt: 34, sum: 2 }
    ]
  },
  {
    order: 236,
    Dat: '25-11',
    firma: 213,
    director: 96,
    zakaz: [
      { produkt: 24, sum: 7 },
      { produkt: 34, sum: 2 }
    ]
  }
];
let slovarFirm = [
  { kod: 156, name: 'Ямал-сервис' },
  { kod: 213, name: 'Рассвет' },
  { kod: 368, name: 'ЭлектроСила' }
];
let slovarPers = [
  { kod: 12, name: 'Иванов' },
  { kod: 45, name: 'Петров' },
  { kod: 96, name: 'Сидоров' }
];
let slovarProd = [
  { kod: 17, name: 'Бумага' },
  { kod: 19, name: 'Маркеры' },
  { kod: 24, name: 'Скрепки' },
  { kod: 34, name: 'Карандаши' }
];
const createObj = (arr) =>
  arr.reduce(function (obj, el) {
    obj[el.kod] = el.name;
    return obj;
  }, {});
slovarFirm = createObj(slovarFirm);
slovarPers = createObj(slovarPers);
slovarProd = createObj(slovarProd);
arrayMain = arrayMain.map(function (ob) {
  ob.firma = slovarFirm[ob.firma];
  ob.director = slovarPers[ob.director];
  ob.zakaz.forEach(function (el) {
    el.produkt = slovarProd[el.produkt];
  });
  return ob;
});
console.log(arrayMain);
Ответить с цитированием
  #6 (permalink)  
Старый 07.12.2022, 14:05
Интересующийся
Отправить личное сообщение для Neznajka Посмотреть профиль Найти все сообщения от Neznajka
 
Регистрация: 26.07.2022
Сообщений: 26

Ага, вот теперь уразумел. А то в моём древнем мозгу новый синтаксис пока идёт со скрипом Но я стараюсь
Благодарю Вас ещё раз!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена строк в массиве! Нужна помощь в коде! Ollp Общие вопросы Javascript 1 28.09.2019 13:50
сравнение свойств объектов piaNINA Events/DOM/Window 4 20.09.2016 16:29
Вызов свойств объектов из массива или объекта с параметрами Sanu0074 jQuery 4 22.05.2015 10:18
Поиск в массиве объектов desperado Общие вопросы Javascript 1 26.02.2015 12:34
Поиск объектов в массиве Lynatik Общие вопросы Javascript 24 22.06.2013 12:43