Как мне улучшить этот код с помощью for или filter?

Мне нужно решить 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);
};
3
задан 29.11.2019, 01:59
2 ответа

Если то, что ты хочешь, является 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);
1
ответ дан 01.12.2019, 10:39

Читая и перечитывая я думаю, что я понимаю лучше. Каждый элемент "продажи" - один 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 и у него есть два аргумента:

  1. одна funciГіn, что получает два parГЎmetros

    • Аккумулятор (это может быть что tГє ты захотел)
    • , элемент array настоящего цикла.
  2. начальная стоимость аккумулятора.

Например может быть использованным, чтобы складывать

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.

Повторять на обоих подразумевает делать картезианский продукт обоих, и это не хорошая идея.

0
ответ дан 01.12.2019, 10:39

Теги

Похожие вопросы