根据最大值和长度对数组进行分组

时间:2020-02-14 02:27:08

标签: javascript arrays underscore.js lodash

很难对该数组进行分组。任何建议。

例如,我有一个数组var a = [10, 100, 20, 50, 20, 50, 70, 120]

,我的最大值为150,最小长度为3,即每个子数组的总和为150,最大长度为3

任何使它像这样[[10, 100, 20], [50, 20, 50], [70], [120]]

的建议

预先感谢

1 个答案:

答案 0 :(得分:1)

在这里,groupArray函数将在您的输入上进行迭代,并根据所提供的最大长度和最大和来构建组。

function groupArray(input, maxSum, maxLen) {
  const res = [[]];
  let mark = 0;
  let sum = 0;

  input.forEach( ele => {  
    // if the current group has already reach maxLenght or maxSum
    // then create a new group
    if ( res[mark].length > (maxLen-1)
        || (sum + ele) > maxSum ) {
      res.push([ele]);
      mark++;
      sum = ele;
    }
    // otherwise add to current grop
    else {
      res[mark].push(ele);
      sum += ele;
    }
  });
  return res;
}

const test_1 = [10, 100, 20, 50, 20, 50, 70, 120];
const test_2 = [10, 130, 20, 50, 20, 50, 70, 120];
const test_3 = [140, 110, 20, 50, 20, 50, 70, 120];

console.log(groupArray(test_1, 150, 3));
console.log(groupArray(test_2, 150, 3));
console.log(groupArray(test_3, 150, 3));

注意:由于问题没有任何其他规则,因此此函数不会对数组重新排序,也不会尝试寻找最佳的长度匹配或最佳的总和匹配。