Каково наилучшее решение для получения наилучшей комбинации суммы между двумя параметрами в массиве объектов?

#javascript

#javascript

Вопрос:

Я пытаюсь построить простой алгоритм для достижения наилучшей комбинации значений на основе двух параметров в array оф objects .

Весь черновик кода здесь

Сначала у меня есть array хранилище objects , элементы, которые будут проанализированы и упакованы в тома вместе. Все значения находятся внутри percentages .

 const nonStackableItems = [
    {
      id: 0,
      m2: 15,
      m3: 11,
      weight: 20
    },
    {
      id: 1,
      m2: 25,
      m3: 12,
      weight: 42
    },
    {
      id: 2,
      m2: 50,
      m3: 13,
      weight: 40
    },
    {
      id: 3,
      m2: 65,
      m3: 14,
      weight: 25
    }
  ];
 

Это фрагмент кода, который выполняет вычисления:

Идея состоит в том, чтобы объединить эти объекты в пакеты, соблюдая значение maximum 100% для каждого значения (за исключением m3 этого случая, поскольку height в этом первом анализе у всех пакетов должно быть достаточно).

Итак, подход, который я дал, просто недостаточно хорош, поскольку я сортирую это array по m2 then by weight , вызываю function , а затем сравниваю длину обоих, а затем выбираю результат, который создает меньшие объемы.

 function nSVolHelper(arr, vol, param1, param2) {
    let newVol = {
      id: vol.length,
      m2: 0,
      m3: 0,
      weight: 0
    };
    for (let i = 0; i < arr.length; i  ) {
      const validation =
        newVol[param1]   arr[i][param1] < 100 amp;amp;
        newVol.m2   arr[i][param2] < 100;
      if (validation) {
        newVol.m2  = arr[i].m2;
        newVol.m3  = arr[i].m3;
        newVol.weight  = arr[i].weight;
      }
      if (!validation) {
        return nSVolHelper(arr.slice(i), [...vol, newVol], param1, param2);
      }
    }
    vol.push(newVol);
    return vol;
  }

  function nSVol(arr, param1, param2) {
    return nSVolHelper(arr, [], param1, param2);
  }
 

Я хотел бы найти способ сделать это, не принимая за основу порядок array , чтобы получить точное вычисление без запуска ненужного кода, без необходимости запускать код, упорядочивающий массивы по отдельности, а затем сравнивая их. Это не дает наилучшей комбинации.

В качестве примера для лучшего понимания:

Если я передам массив, отсортированный по weight , я получу создать 2 тома.

 console.log(
    "call",
    nSVol(
      nonStackableItems.sort((a, b) => a.weight - b.weight),
      "weight",
      "m2"
    )
 

Если я передам это же array отсортированное по m2 , я получу 3 тома.

 console.log(
    "call",
    nSVol(
      nonStackableItems.sort((a, b) => a.m2 - b.m2),
      "weight",
      "m2"
    )
 

Заранее большое спасибо.

Приветствия

Комментарии:

1. В частности, «Другой способ мышления …»?

2. Если код работает и вы ищете советы по его улучшению, Code Review — подходящее место. Но посмотрите codereview.meta.stackexchange.com/questions/5777 /… первый.

3. Мой вопрос касается необходимости решения, которое не достигается с помощью моего кода. Речь идет не просто о проверке, речь идет о фрагменте кода, который не выполняет то, что требуется. Вам не кажется, что это подходит для stackoverflow?

4. вероятно, проще использовать reduce tbh

5. Я думал for , что это более легкий метод @DenisTsoi. Я использовал reduce в начале. Но это не в центре внимания вопроса здесь