我有一个具有id和size属性的对象数组。对象大小的总和等于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'},
]
]
答案 0 :(得分:0)
您可以使用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);
答案 1 :(得分:0)
这是一个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);