将数组排序成集合的算法

时间:2016-05-17 12:45:00

标签: javascript sorting splice

我有n个n对象数组,如下所示:

[{'item1': 144},
 {'item2': 0},
 {'item3': 366},
 {'item4': 15},
 {'item6': 366},
 {'item7': 19},
 {'item8': 211},
 {'item9': 121}]

项目值为0-n。

我需要根据它们的值来表示具有不同大小的这些项目。

要做到这一点,我最初的想法是将数组拼接成四个小数组:XL,L,M,S。

我不确定如何将数组分类为这4组。

2 个答案:

答案 0 :(得分:0)

使用第三方库underscore的解决方案:



var arr = [
   {'item1': 144},
   {'item2': 0},
   {'item3': 366},
   {'item4': 15},
   {'item5': 366},
   {'item6': 19},
   {'item7': 211},
   {'item8': 121}];

//max value n
var n = 400;

var result = _.groupBy(arr, function(item, i){ 
    var val = item["item" + (i + 1)];

    //group together values that are in the same quarter of the max value n
    if (val < n / 4) {
        return "S";
    } else if (val < n / 2) {
        return "M";
    } else if (val < 0.75 * n) {
        return "L";
    } else {
        return "XL";
    }
});

document.write(JSON.stringify(result));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是一个提案,其范围为XL,L,M,S和分组结果的对象。

var data = [{ 'item1': 144 }, { 'item2': 0 }, { 'item3': 366 }, { 'item4': 15 }, { 'item6': 366 }, { 'item7': 19 }, { 'item8': 211 }, { 'item9': 121 }],
    range = { XL: 400, L: 300, M: 200, S: 100 },
    keys = Object.keys(range).sort(function (a, b) { return range[a] - range[b]; }),
    groups = {};

keys.forEach(function (k) { groups[k] = []; });

data.forEach(function (a) {
    keys.some(function (k) {
        var key = Object.keys(a)[0];
        if (a[key] < range[k]) {
            groups[k].push(a);
            return true;
        }
    });
});

document.write('<pre>' + JSON.stringify(groups, 0, 4) + '</pre>');