07.12.2022, 11:47
|
Интересующийся
|
|
Регистрация: 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 кодов фирм, директоров и продуктов наименованиями из соответствующих словарных массивов. Можно ли это сделать поэлегантнее, чем вложенными циклами?
|
|
07.12.2022, 12:17
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,127
|
|
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)
|
|
07.12.2022, 12:37
|
Интересующийся
|
|
Регистрация: 26.07.2022
Сообщений: 26
|
|
To рони:
Большое спасибо! Я делал чисто на forEach'ах, но Ваш код работает заметно быстрее на большом количестве записей (>5000). Правда, Ваш код тут непосредственно на странице почему-то не запускается, зато на https://runjs.co - срабатывает без сучка-задоринки. Спасибо!
|
|
07.12.2022, 13:06
|
Интересующийся
|
|
Регистрация: 26.07.2022
Сообщений: 26
|
|
Ещё одна просьба, рони - напишите, пожалуйста, как выглядел бы без стрелочных функций вот этот фрагмент
const createObj = arr => arr.reduce((obj, {kod,name}) => (obj[kod] = name, obj), {})
Я сделал промежуточный console.log() и поэтому интуитивно понимаю, что там в конце происходит, но хочу "прочувствовать" каждый шаг процесса
|
|
07.12.2022, 13:35
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,127
|
|
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);
|
|
07.12.2022, 14:05
|
Интересующийся
|
|
Регистрация: 26.07.2022
Сообщений: 26
|
|
Ага, вот теперь уразумел. А то в моём древнем мозгу новый синтаксис пока идёт со скрипом Но я стараюсь
Благодарю Вас ещё раз!
|
|
|
|