@itwaze
Web Developer

Как переместить объект из одного массива в другой по условию?

Помогите мне допилить мой код, чтобы он работал так, как я хотел бы.

У меня есть массив массивов (назовем их контейнеры), они уже отсортированы по максимальному весу на контейнер 3300.

Условие: необходимо начать с массива C и переместить объект из контейнера B в контейнер C, если в контейнере C есть свободное место (а это 3300 минус сумма всех обьектов внутри контейнера) и объект из контейнера B имеет stage такой же как и объекты внутри контейнера C, то нужно перенести его. И повторить это для контейнеров B, перенести объекты из контейнеров A с тем же условием. Например:

const first = [[{serial: '1', weight: 300, stage: 2}], [{serial: '2', weight: 3000, stage: 4}]]
const second = [[{serial: '3', weight: 300, stage: 1}], [{serial: '4', weight: 3000, stage: 2}],  [{serial: '5', weight: 2700, stage: 3}]]

// result
// updatedFirst: [[], [{serial: '2', weight: 3000, stage: 4}]]
// updatedSecond: [[{serial: '3', weight: 300, stage: 1}], [{serial: '1', weight: 300, stage: 2}, {serial: '4', weight: 3000, stage: 2}],  [{serial: '5', weight: 2700, stage: 3}]]


Я переношу first[0] в second[1], потому что сумма всех обьектов внутри контейнера second[1] меньше чем 3300 и имеет тот же stage.

У меня получается это сделать, но не так, как хотелось бы, после переноса объектов остается много свободного места в контейнере. Если, например, в контейнере B есть 1000 свободного пространства, а в контейнере A есть 2 объекта с весом 500 и 1000, мой код будет передавать объект с весом 500, но я хочу, чтобы объект с весом 1000 был перемещен. Помогите решить эту проблему.

Ниже приведет пример с работающим кодом и ниже если комментарии с результатом который получаю я и какой ожидаю.

const a = [[{serial: 'a1', weight: 2100.7, stage: 1}, {serial: 'a2', weight: 946.22, stage: 2}], [{serial: 'a3', weight: 1500, stage: 3}, {serial: 'a4', weight: 990, stage: 3}, {serial: 'a5', weight: 399.1, stage: 4} ]]
const b = [[{serial: 'b1', weight: 1999.7, stage: 1}, {serial: 'b2', weight: 1199.22, stage: 2}], [{serial: 'b3', weight: 10.2, stage: 3}, {serial: 'b4', weight: 599.1, stage: 4}]]
const c = [[{serial: 'c1', weight: 1000, stage: 1}, {serial: 'c2', weight: 59.22, stage: 2}], [{serial: 'c3', weight: 0.2, stage: 3}, {serial: 'c4', weight: 3099.1, stage: 4}]]

const updatedC = [...c]
const updatedB = [...b]

const updateContainers = (arr, from, to) => {
  let index = 0;
  let counter = 0;
  const total = {};

  arr.forEach((container, i) => {
    counter = 0;
    container.forEach(el => {
      const weight = +(counter += el.weight).toFixed(2);
      total[i] = weight;
    });
  });

  Object.keys(total).map((key, i) => {
    let freeSpace = 3300 - total[key];

    if (freeSpace > 0) {
      const stages = arr[i].map(el => el.stage);
      const containerStages = {
        min: Math.min(...stages),
        max: Math.max(...stages)
      };

      from.forEach((cont) => {
        cont.forEach((item, idx) => {
          if ((+item.stage >= containerStages.min && +item.stage <= containerStages.max) && +item.stage <= freeSpace) {
            to[i].push(item)
            freeSpace -= item.stage
            from.forEach((elem, elemI) => {
              elem.forEach((value, valueI) => {
                if (value.serial === item.serial) from[elemI].splice([valueI], 1)
              })
            })
          }
        })
      })
    }
  });
};

updateContainers(c, b, updatedC)
updateContainers(b, a, updatedB)

console.log(updatedC)
console.log(updatedB)
console.log(a)




// My result:
// a[0] free space: 1199.3 a[1] free space: 810
// b[0] free space: 1154.56 - not good; b[1] free space: 2341.8 - not good
// c[0] free space: 241.08 - good; c[1] free space: 190.5 - good


// Expected Result
// a[0] free space: 2353.7; a[1] free space: 2900.9
// a [[ {serial: 'a2', weight: 946.22, stage: 2}], [{serial: 'a5', weight: 399.1, stage: 4} ]]

// b[0] free space: 0.07 - good; b[1] free space: 210.9 - good
// b [[{serial: 'a1', weight: 2100.7, stage: 1}, {serial: 'b2', weight: 1199.22, stage: 2}], [{serial: 'a3', weight: 1500, stage: 3}, {serial: 'a4',weight: 990, stage: 3}, {serial: 'b4', weight: 599.1, stage: 4}]]

// c[0] free space: 241.09 - good; c[1] free space: 190.5 - good
// c [[{serial: 'b1',weight: 1999.7, stage: 1}, {serial: 'c1', weight: 1000, stage: 1}, {serial: 'c2', weight: 59.22, stage: 2}], [{serial: 'c3', weight: 0.2, stage: 3},{serial: 'b3', weight: 10.2, stage: 3}, {serial: 'c4', weight: 3099.1, stage: 4}]]
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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