【问题标题】:split array of objects into three seperate array based on a property根据属性将对象数组拆分为三个单独的数组
【发布时间】:2019-01-16 06:33:06
【问题描述】:

我有一组具有 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'},
 ]
]

【问题讨论】:

  • 到目前为止你尝试过什么? StackOverflow 不会给你解决方案。话虽如此,我认为this post 将是指向正确方向的指针。如果您在尝试用 JavaScript 实现其中一种解决方案后有具体问题,我们可以提供帮助。

标签: javascript arrays object split chunks


【解决方案1】:

这是一个 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);

【讨论】:

    【解决方案2】:

    您可以使用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);

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 2018-07-30
      • 1970-01-01
      • 2019-05-29
      • 2022-01-18
      • 2015-03-14
      • 2018-10-07
      • 2019-05-05
      • 2015-08-09
      相关资源
      最近更新 更多