我有一个数组,例如:
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']]
答案 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);
}