【问题标题】:Javascript Array grouping categoryJavascript数组分组类别
【发布时间】:2014-09-26 21:57:25
【问题描述】:

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

我在这样的数组中有值

var numb = [5,10,11,6,7,18,1,8,2,1,15,12,4,5,3,4,6,7,15,20];

然后按数字升序排序

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

是否可以像这样动态创建组?

【问题讨论】:

  • 组是什么意思。您想将这些值存储在单独的数组中吗?像一个数组中的 1-4.. 然后第二个中的 5-8 等等?
  • 我想动态地从数组的最大值中创建 5 个类别

标签: javascript arrays indexing grouping


【解决方案1】:

// 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 构建组的字典。

它只适用于正数。

【讨论】:

  • 你为什么使用document.write(output)?这是否打算在页面加载时运行?
  • 不,那只是为了SO sn-p,这样你就可以看到结构了。
【解决方案2】:

假设 1-4, 5-8, 9-12, 13-16, 17-20 分组意味着您需要 5 个组,第一个 (1-4) 包含 [1, 4 ] 间隔;第二个 (5-8) 包含 [5, 8] 区间内的所有数字,依此类推。

// 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);

输出:

[ [ 1, 1, 2, 3, 4, 4 ],
  [ 5, 5, 6, 6, 7, 7, 8 ],
  [ 10, 11, 12 ],
  [ 15, 15 ],
  [ 18, 20 ] ]

编辑:阅读有关根据数组中的最大数计算间隔的评论后。

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);

输出:

[ [ 1, 1, 2, 3, 4, 4 ],
  [ 5, 5, 6, 6, 7, 7, 8 ],
  [ 10, 11, 12 ],
  [ 15, 15 ],
  [ 18, 20 ] ]

【讨论】:

    【解决方案3】:

    代码:假设 sortedNumb 不为空 :)

    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);
    

    输出:

    [Array[6], Array[7], Array[3], Array[2], Array[2]]
    

    编辑

    您似乎想要一个 4 组的范围,如果您想要 N,只需创建一个将其作为参数的函数,并在代码中将所有 4 替换为 N =)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多