首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript数组分组类别

Javascript数组分组类别
EN

Stack Overflow用户
提问于 2014-09-26 07:25:51
回答 3查看 880关注 0票数 1

我在对数值数组进行分组时遇到了问题:

我在这样的数组中有值

代码语言:javascript
复制
var numb = [5,10,11,6,7,18,1,8,2,1,15,12,4,5,3,4,6,7,15,20];

然后按升序排序。

代码语言:javascript
复制
var sortedNumb = [1,1,2,3,4,4,5,5,6,6,7,7,8,10,11,12,15,15,18,20];

现在我想创建一组数字,如

1-4,5-8,9-12,13-16,17-20

有可能像这样动态地创建组吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-26 10:47:50

假设1-4,5-8,9-12,13-16,17-20分组意味着你想要5个组,第一个组(1-4组)包含1,4区间内的所有数字;第二个组(5-8组)包含5,8间隔内的所有数字,等等。

代码语言:javascript
复制
// numbers and intervals must be in ascending order
var numb = [5,10,11,6,7,18,1,8,2,1,15,12,4,5,3,4,6,7,15,20];
// 1-4 , 5-8 , 9-12 , 13-16 , 17-20
var intervals = [4, 8, 12, 16, 20];

numb.sort(function (a, b) {
  return a - b;
});

var groups = [];
var j = 0;
for (var i = 0; i < intervals.length; i++) {
  var group = [];
  while (numb[j] <= intervals[i]) {
    group.push(numb[j]);
    j++;
  }
  groups.push(group);
}
console.log(groups);

产出:

代码语言:javascript
复制
[ [ 1, 1, 2, 3, 4, 4 ],
  [ 5, 5, 6, 6, 7, 7, 8 ],
  [ 10, 11, 12 ],
  [ 15, 15 ],
  [ 18, 20 ] ]

编辑:阅读了关于根据数组中的最大数计算间隔的注释之后。

代码语言:javascript
复制
var numb = [5,10,11,6,7,18,1,8,2,1,15,12,4,5,3,4,6,7,15,20];

numb.sort(function (a, b) {
  return a - b;
});

var max = numb[numb.length - 1];
// Five groups based on the max value of the array
var increment = max / 5;
var groups = [];
var j = 0;
for (var i = increment; i <= max; i += increment) {
  var group = [];
  while (numb[j] <= i) {
    group.push(numb[j]);
    j++;
  }
  groups.push(group);
}
console.log(groups);

输出:

代码语言:javascript
复制
[ [ 1, 1, 2, 3, 4, 4 ],
  [ 5, 5, 6, 6, 7, 7, 8 ],
  [ 10, 11, 12 ],
  [ 15, 15 ],
  [ 18, 20 ] ]
票数 0
EN

Stack Overflow用户

发布于 2014-09-26 10:15:28

代码语言:javascript
复制
// important code

var numberToGroupOn = 4;

var numb = [5,10,11,6,7,18,1,8,2,1,15,12,4,5,3,4,6,7,15,20];
var srt = numb.slice(0).sort(function(a, b) { return a - b; });

var groupCount = Math.ceil(srt[srt.length-1] / numberToGroupOn);

var grps = {};

for(var i = 1; i <= groupCount; i++)
  {
    grps[((i*numberToGroupOn)-(numberToGroupOn-1)).toString() + '-' + (i*numberToGroupOn).toString()] = 
      srt.filter(function(a) {return (a <= i*numberToGroupOn) && (a >= (i*numberToGroupOn)-(numberToGroupOn-1))});
  }

// unimportant code to see output in SO snippet

var output = '';

for(var key in grps)
  {
    output += key + ': ' + grps[key]+'<br>';
  }

document.write(output);

这将计算出组的数量,然后使用Array.prototype.filter构建组的字典。

它只适用于正数。

票数 2
EN

Stack Overflow用户

发布于 2014-09-26 08:17:19

代码:假设sortedNumb不是空的:)

代码语言:javascript
复制
var sortedNumb = [1,1,2,3,4,4,5,5,6,6,7,7,8,10,11,12,15,15,18,20];
var groups = [[sortedNumb[0]]];
var lastfirstValueInArray = sortedNumb[0];
var i = 1;
var j = 0;

while (i < sortedNumb.length)
{
    if (sortedNumb[i] >= lastfirstValueInArray+4 || (sortedNumb[i]%4 == 1 && sortedNumb[i] != lastfirstValueInArray)) 
    {
        j++;
        lastfirstValueInArray = 1+j*4;
        groups[j] = [];
    }
    groups[j][groups[j].length] = sortedNumb[i];
    i++;
}

console.log(groups);

输出:

代码语言:javascript
复制
[Array[6], Array[7], Array[3], Array[2], Array[2]]

编辑

您似乎想要一个4的组,如果您想要N,只需创建一个以它为参数的函数,并在code =中用N替换所有的4 )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26054209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档