【问题标题】:How to create array chunk based on property value如何根据属性值创建数组块
【发布时间】:2022-10-13 23:29:36
【问题描述】:

我有一个这样的数组:

const arr = [{flagCount: 3, rank:1}, {flagCount: 3, rank:2}, {flagCount: 1, rank:3}, {flagCount: 1,rank:4}, {flagCount: 1, rank:5}, {flagCount: 2, rank:6},{flagCount: 2, rank:7},{flagCount: 2,rank:8},{flagCount: 1,rank:9}]

现在,我想将对象分组为块,其中单个块将包含总标志数为 3 或更少的对象(不应超过3) -

例如,结果数组应如下所示:

const resultArr = [[{flagCount: 3,rank:1}], [{flagCount: 3,rank:2}], [{flagCount: 1,rank:3}, {flagCount: 1,rank:4}, {flagCount: 1,rank:5}], [{flagCount: 2,rank:6}], [{flagCount: 2,rank:7}], [{flagCount: 2,rank:8}, {flagCount: 1,rank:9}]]

即,在任何给定的块中,flagCount 值不超过 3。

此外,在块数组中也必须保持排名顺序!

我该如何做到这一点?

【问题讨论】:

  • 似乎一个简单的for 循环就可以实现这一点。你试过什么吗?自己研究过解决这个问题吗?
  • 有什么帮助吗?我试过运行一个 for 循环并在每次迭代时切片!有什么帮助吗?在你否决这个问题之前?
  • 这回答了你的问题了吗? Split array into chunks of a total value
  • @HereticMonkey 不幸的是没有!想象一下给定数组中的每个对象都有一个等级 - 例如第一个对象的等级为 1.. 第二个对象的等级为 2.. 等等。分块数组必须以相同的顺序保持排名。分块数组不应该随机挑选对象并放入嵌套数组中。
  • @HereticMonkey 我已经用 rank 编辑了问题!

标签: javascript typescript ecmascript-6


【解决方案1】:

它可以使用时间数组来解决,在迭代初始数组的项目时存储每个块。

const arr = [{flagCount: 3}, {flagCount: 3}, {flagCount: 1}, {flagCount: 1}, {flagCount: 1}, {flagCount: 2},{flagCount: 2},{flagCount: 2},{flagCount: 1}];

// your final array
const chunkedArr = [];
// a temp array to store each chunk
let currentChunk = [];

arr.forEach(x => {
  if (currentChunk.length === 0) {
    currentChunk = [x];
    return;
  }

  const currentChunkTotalCount = currentChunk.reduce((p, c) => p + c.flagCount, 0);

  if (currentChunkTotalCount + x.flagCount > 3) {
    chunkedArr.push(currentChunk);
    currentChunk = [x];
  } else {
    currentChunk.push(x);
  }
});

if (currentChunk.length) chunkedArr.push(currentChunk);

console.log(chunkedArr);

检查小提琴:https://jsfiddle.net/rzxqky06/

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2019-12-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多