组数组的值在10的倍数的相同范围内

时间:2015-02-10 11:45:03

标签: javascript jquery arrays

我有一个数组,例如:

var arr = [2,4,7,11,25,608,65,109,99,100,504,606,607];

我需要这样做,以使每个值在10以下的倍数范围内,并且在它之上的10的倍数被组合在一起。

例如,2,4,7介于0到10之间,因此它们必须在一起。 11个人将独自一人,如25,65等。 606,607,608将在一起。

上面的数组应该变为:

[ [2,4,7],[11],[25],[65],[99],[101],[504],[100,109],[606,607,608] ]

我一直在考虑它几个小时,我还没有想出任何东西。这真的很糟糕,不值得一提,但到目前为止我正在玩Math.round(http://jsfiddle.net/40napnyx/2/

编辑: 我想补充一个问题(如果实际答案不包括这个新问题的解决方案,我不会根据这个问题选择正确的答案。)

数组可能包含带字母的值。这些值应按字母顺序排列在同一组中(仅用第一个字母确定顺序)。该组应该是结果数组中的最后一个值。

所以举个例子 var arr = [2, 4, 11,'a3', 25, 7, 'j', 'bzy4];

将是[[2,4,7],[11],[25],['a3','bzy4', 'j']]

2 个答案:

答案 0 :(得分:5)

这是一个通用函数:

function groupBy(ary, keyFunc) {
  var r = {};
  ary.forEach(function(x) {
    var y = keyFunc(x);
    r[y] = (r[y] || []).concat(x);
  });
  return Object.keys(r).map(function(y) {
    return r[y];
  });
}

// usage:

var arr = [2,4,7,11,25,608,65,99,101,504,606,607];

g = groupBy(arr, function(x) { return Math.floor(x / 10) });

document.write(JSON.stringify(g));

对于您的红利问题,只需应用groupBy两次:

    function groupBy(ary, keyFunc) {
      var r = {};
      ary.forEach(function(x) {
        var y = keyFunc(x);
        r[y] = (r[y] || []).concat(x);
      });
      return Object.keys(r).map(function(y) {
        return r[y];
      });
    }





var arr = [2, 4, 11,'a3', 25, 7, 'j', 'bzy4'];
g = groupBy(arr, isNaN);

g = [].concat(
  groupBy(g[0], function(x) { return Math.floor(x / 10) }),
  [g[1].sort()]
);
          
document.write(JSON.stringify(g));

答案 1 :(得分:1)

这就是我提出的:

var arr = [2,4,7,11,25,65,99,101,504,606,607,608];
arr.sort(function(a, b) {
    if(a > b) return 1;
    if(a < b) return -1;
    else return 0;
});

var grouped_array = [];
for(var i = 0; i < arr.length; i++) {
    var group = [];
    var curr_group = Math.floor(arr[i]/10);
    while(Math.floor(arr[i]/10) == curr_group) {
        group.push(arr[i]);
        i++;
    }
    grouped_array.push(group);
}

http://jsfiddle.net/40napnyx/3/