Помогите мне допилить мой код, чтобы он работал так, как я хотел бы.
У меня есть массив массивов (назовем их контейнеры), они уже отсортированы по максимальному весу на контейнер 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}]]