Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Упорядоченная замена свойств в массиве объектов (https://javascript.ru/forum/misc/84750-uporyadochennaya-zamena-svojjstv-v-massive-obektov.html)

Neznajka 07.12.2022 11:47

Упорядоченная замена свойств в массиве объектов
 
Есть четыре массива - один основной и три словарных, содержащих подстановочные значения:
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 кодов фирм, директоров и продуктов наименованиями из соответствующих словарных массивов. Можно ли это сделать поэлегантнее, чем вложенными циклами?

рони 07.12.2022 12:17

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)

Neznajka 07.12.2022 12:37

To рони:
Большое спасибо! Я делал чисто на forEach'ах, но Ваш код работает заметно быстрее на большом количестве записей (>5000). Правда, Ваш код тут непосредственно на странице почему-то не запускается, зато на https://runjs.co - срабатывает без сучка-задоринки. Спасибо!

Neznajka 07.12.2022 13:06

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

Я сделал промежуточный console.log() и поэтому интуитивно понимаю, что там в конце происходит, но хочу "прочувствовать" каждый шаг процесса

рони 07.12.2022 13:35

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);

Neznajka 07.12.2022 14:05

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


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