разбить массив объектов на три отдельных массива на основе свойства - PullRequest
0 голосов
/ 16 января 2019

У меня есть массив объектов со свойством id и размера. Сумма размеров объектов равна 78, и я хочу разделить эти объекты на три массива. Но я хочу разделить возможно равную сумму размера (~ 78/3 + -).

У меня есть этот массив объектов,

[
 {'id': '1', 'size': '10'},
 {'id': '2', 'size': '4'},
 {'id': '3', 'size': '6'},
 {'id': '4', 'size': '21'},
 {'id': '5', 'size': '2'},
 {'id': '6', 'size': '1'},
 {'id': '7', 'size': '6'},
 {'id': '8', 'size': '7'},
 {'id': '9', 'size': '8'},
 {'id': '1', 'size': '13'}
]

а я хочу

[
 [
  {'id': '4', 'size': '21'},
  {'id': '2', 'size': '4'}, 
  {'id': '6', 'size': '1'},
 ],
 [
  {'id': '1', 'size': '13'},
  {'id': '1', 'size': '10'},
  {'id': '5', 'size': '2'},
 ],
 [
  {'id': '3', 'size': '6'}, 
  {'id': '9', 'size': '8'},
  {'id': '7', 'size': '6'},
  {'id': '8', 'size': '7'},
 ]
]

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Это NP-полная проблема, поэтому существует более одного решения. Один из подходов, о котором я подумал, - это сначала поместить более крупные предметы, а затем поместить более мелкие, где у вас будет больше места.

let items = [
    {'id': '1', 'size': 10},
    {'id': '2', 'size': 4},
    {'id': '3', 'size': 6},
    {'id': '4', 'size': 21},
    {'id': '5', 'size': 2},
    {'id': '6', 'size': 1},
    {'id': '7', 'size': 6},
    {'id': '8', 'size': 7},
    {'id': '9', 'size': 8},
    {'id': '1', 'size': 13}
];
//sort the array by size in reverse order
items.sort((a, b)=> b.size - a.size);
//array of sums
let sums = [0,0,0];
//final array of 3 arrays
let arrays = [[],[],[]];
for (let item of items) {
    //get index of the smallest sum
    let index =  sums.indexOf(Math.min.apply(null,sums));
    //add current item size to corresponding sum
    sums[index] += item.size;
    //add item to corresponding array
    arrays[index].push(item);
}
console.log(arrays);
console.log(sums);
0 голосов
/ 16 января 2019

Вы можете использовать цикл while():

var arr = [
 {'id': '1', 'size': '10'},
 {'id': '2', 'size': '4'},
 {'id': '3', 'size': '6'},
 {'id': '4', 'size': '21'},
 {'id': '5', 'size': '2'},
 {'id': '6', 'size': '1'},
 {'id': '7', 'size': '6'},
 {'id': '8', 'size': '7'},
 {'id': '9', 'size': '8'},
 {'id': '1', 'size': '13'}
];
var i=0, res = [], tempArr=[];
while(i<arr.length){
  if(i!==0 && i%3 === 0){
    res.push(tempArr);
    tempArr = [arr[i]];
  } else {
    tempArr.push(arr[i]);
  }
  i++;
}
res.push(tempArr);
console.log(res);
...