Мне нужно решить precioMaquina()
, так как он не возвращает сумму цены компонентов, кроме того, я думаю, что это может быть значительно упрощено.
Это слоган: цена машины (компоненты): он получает массив компонентов и возвращает цену машины, которая может быть собрана с этими компонентами, которая является суммой цен каждого включенного компонента.
const ventas = [
[ 100000000, 4, 2, 2019, 'Grace', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500'] ],
[ 100000001, 1, 1, 2019, 'Ada', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500'] ],
[ 100000002, 2, 1, 2019, 'Grace', 'Caballito', ['Monitor ASC 543', 'Motherboard MZI', 'HDD Toyiva'] ],
[ 100000003, 10, 1, 2019, 'Ada', 'Centro', ['Monitor ASC 543', 'Motherboard ASUS 1200'] ],
[ 100000004, 12, 1, 2019, 'Grace', 'Caballito', ['Monitor GPRS 3000', 'Motherboard ASUS 1200'] ],
[ 100000005, 21, 3, 2019, 'Hedy', 'Caballito', ['Monitor ASC 543', 'Motherboard ASUS 1200', 'RAM Quinston'] ]
]
const precios = [
[ 'Monitor GPRS 3000', 200 ],
[ 'Motherboard ASUS 1500', 120 ],
[ 'Monitor ASC 543', 250 ],
[ 'Motherboard ASUS 1200', 100 ],
[ 'Motherboard MZI', 30 ],
[ 'HDD Toyiva', 90 ],
[ 'HDD Wezter Dishital', 75 ],
[ 'RAM Quinston', 110 ],
[ 'RAM Quinston Fury', 230 ]
];
const precioMaquina = (componentes) => {
let totalMaquina = 0;
for (let i=0; i<ventas.length; i++) {
if(ventas[i][6] == componentes) {
for (let e=0; e<ventas.length; e++) {
for (let x=0; x<precios.length; x++) {
if (precios[x][0] == ventas [i][6][e]) {
totalMaquina += precios[x][1];
}
}
}
}
}
return(totalMaquina);
};
Если то, что ты хочешь, является array с ценой каждый mГЎquina ventas
, ты можешь делать в принципе один map()
на продажах, потому что она relaciГіn - один в один, потом в элементе компонентов, можешь делать .reduce()
, потому что она relaciГіn он много в один (сумма цен). Чтобы искать цену ты можешь использовать один for
с одним break
, который мне кажется, что это больше Гіptimo, для того, чтобы он не повторил на всех ценах. Пример:
const ventas = [
[100000000, 4, 2, 2019, 'Grace', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500']],
[100000001, 1, 1, 2019, 'Ada', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500']],
[100000002, 2, 1, 2019, 'Grace', 'Caballito', ['Monitor ASC 543', 'Motherboard MZI', 'HDD Toyiva']],
[100000003, 10, 1, 2019, 'Ada', 'Centro', ['Monitor ASC 543', 'Motherboard ASUS 1200']],
[100000004, 12, 1, 2019, 'Grace', 'Caballito', ['Monitor GPRS 3000', 'Motherboard ASUS 1200']],
[100000005, 21, 3, 2019, 'Hedy', 'Caballito', ['Monitor ASC 543', 'Motherboard ASUS 1200', 'RAM Quinston']]
]
const precios = [
['Monitor GPRS 3000', 200],
['Motherboard ASUS 1500', 120],
['Monitor ASC 543', 250],
['Motherboard ASUS 1200', 100],
['Motherboard MZI', 30],
['HDD Toyiva', 90],
['HDD Wezter Dishital', 75],
['RAM Quinston', 110],
['RAM Quinston Fury', 230]
];
const preciosMaquinas = ventas.map(v => v[6].reduce((p, c) => {
for (let i = 0; i < precios.length; i++) {
if (precios[i][0] === c) {
p += precios[i][1];
break;
}
}
return p;
}, 0));
console.log(preciosMaquinas);
Читая и перечитывая я думаю, что я понимаю лучше. Каждый элемент "продажи" - один mГЎquina (компьютер или настольный компьютер, которые они снабжают одной combinaciГіn предметами). TГє ты хочешь общую цену на одну mГЎquina ввиду того, что он состоит из X компонентов.
того, что озадачивает меня, состоит в том, что в тебе funciГіn ты входишь ища из-за "компонентов" и это сравниваешь с ventas[i][6]
, который является array. ВїNo serГ - в лучше в этом случае искать из-за коррелятивного продажи?
, Поскольку он состоял, в случае в том, чтобы ты искал одну funciГіn, типа function calculaTotal(['pieza1','pieza2']) {..}
, который вручает тебе цену на компьютер (например чтобы котировать перед тем, как покупать), у тебя есть базовая ошибка:
let equipo1=['hdd','monitor'],
equipo2=['hdd','monitor'];
console.log(equipo1==equipo2);
В javascript два объекта не равны если только это не будут тот же самый. Если ты сравниваешь два arrays, ты должен пробегать их или implotarlos, stringificarlos... и т.д.
AcГЎ resolvГ - что я думаю, что ты хочешь сделать (что у меня не остается ясным) двух способов, и есть многие mГЎs. Оба используют reduce
.
mГ©todo Array.prototype.reduce
применяется на array и у него есть два аргумента:
одна funciГіn, что получает два parГЎmetros
начальная стоимость аккумулятора.
Например может быть использованным, чтобы складывать
let total = [1, 2, 3, 4].reduce((accum, numero) => {
accum+=numero;
return accum; <=== esto es muy muy importante
},0) // <== el acumulador empieza en cero
В первой, фильтр между списком тех цен, которые интересуют меня (они pasГ© в "компонентах"), и потом я делаю один уменьши на тех, которые sГ - появляются, с нею lГіgica суммы:
total = lista_de_precios
.filter(tupla => {
return componentes.includes(tupla[0]); // está entre los componentes?
}).reduce((acumulador, tupla)=>{
// voy sumando al acumulador
acumulador+=tupla[1];
},0);
, Чтобы выдавать использование Array.prototype.includes. Ничто из повторений, что один страдает морской болезнью.
Во второй funciГіn заблаговременно я превращаю array tuplas [предмет, я оцениваю] в объект, который является словарем типа
{
'Monitor GPRS 3000' : 200,
'Motherboard ASUS 1500' : 120
}
, Где ты можешь искать прямо по имени вместо того, чтобы повторять. Для этого ты пробегаешь единственный раз array.
const ventas = [
[100000000, 4, 2, 2019, 'Grace', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500']],
[100000001, 1, 1, 2019, 'Ada', 'Centro', ['Monitor GPRS 3000', 'Motherboard ASUS 1500']],
[100000002, 2, 1, 2019, 'Grace', 'Caballito', ['Monitor ASC 543', 'Motherboard MZI', 'HDD Toyiva']],
[100000003, 10, 1, 2019, 'Ada', 'Centro', ['Monitor ASC 543', 'Motherboard ASUS 1200']],
[100000004, 12, 1, 2019, 'Grace', 'Caballito', ['Monitor GPRS 3000', 'Motherboard ASUS 1200']],
[100000005, 21, 3, 2019, 'Hedy', 'Caballito', ['Monitor ASC 543', 'Motherboard ASUS 1200', 'RAM Quinston']]
]
const precios = [
['Monitor GPRS 3000', 200],
['Motherboard ASUS 1500', 120],
['Monitor ASC 543', 250],
['Motherboard ASUS 1200', 100],
['Motherboard MZI', 30],
['HDD Toyiva', 90],
['HDD Wezter Dishital', 75],
['RAM Quinston', 110],
['RAM Quinston Fury', 230]
];
const usandoArrays = (componentes) => {
let precioTotal=0;
return precios.filter(tupla=>{
return componentes.includes(tupla[0]); // está la pieza entre los componentes?
}).reduce((accum, tupla)=>{
let [pieza,precio]=tupla;
accum+= parseFloat(precio||0,10);
return accum;
},0);
};
// Acá me hago un arreglo de llave/valor con los precios
const preciosObj = precios.reduce((accum, tupla) => {
let [pieza, precio] = tupla;
accum[pieza] = precio;
return accum;
}, {});
// Suponiendo que componentes sea un array
const usandoObjetos = (componentes) => {
return componentes.reduce((accum, componente) => {
accum = accum + parseFloat(preciosObj[componente] || 0, 10);
return accum;
}, 0);
};
console.log('usandoObjetos me da:',usandoObjetos(['Monitor ASC 543', 'Motherboard ASUS 1200', 'RAM Quinston']))
console.log('usandoArrays me da:',usandoArrays(['Monitor ASC 543', 'Motherboard ASUS 1200', 'RAM Quinston']))
Важное состоит в том, чтобы иметь в виду, что у твоего прайс-листа может быть 1000 продуктов, но у компьютера не может быть 1000 предметов. Значь, что он всегда mГЎs работоспособно, выдавать самый больший array и потом, если необходимо повторять на самом меньшем array.
Повторять на обоих подразумевает делать картезианский продукт обоих, и это не хорошая идея.