簡體   English   中英

如何在JavaScript中對數組進行統計分類?

[英]How to do statistical classification on an array in javascript?

我在數組中有一堆數字,我需要對它們進行一些統計。 我需要知道數組中每個數字有多少個。

這是數組:

myArray =
[2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 27, 27, 28, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 55, 55, 56, 57, 57, 57, 57, 57, 57, 57, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 73, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 87, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 93, 94, 95, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 99, 99, 99, 99, 99, 101, 101, 102, 102, 103, 103, 105, 105, 105, 106, 107, 107, 108, 108, 109, 109, 109, 109, 110, 112, 112, 113, 113, 113, 114, 114, 115, 116, 116, 117, 118, 120, 121, 121, 121, 122, 122, 123, 123, 123, 124, 124, 124, 124, 125, 126, 127, 128, 129, 130, 130, 131, 131, 131, 131, 132, 133, 133, 134, 134, 134, 136, 136, 136, 136, 137, 137, 137, 138, 138, 138, 139, 139, 139, 140, 141, 141, 142, 142, 143, 144, 144, 144, 144, 145, 150, 150, 153, 155, 159, 160, 160, 161, 162, 164, 164, 166, 176, 180, 180, 180, 181, 181, 187, 191, 192, 193, 194, 197, 200, 203, 211, 216, 224, 251, 280, 333]

這是我目前用來解析它的內容(效果不佳):

    for (var key in myArray){
        var obj = myArray[key];

        var count = 0;
        while(obj < 30){
            myArrayStats[0] = count;
            obj++;
        }
        while(obj > 30 && obj < 40){
            myArrayStats[1] = count;
            obj++;
        }
        //etc....
    }

使用對象文字創建一個新數組會更好,更容易使用,但是我不確定該怎么做。

無論您是否對數組進行排序,這都行得通,但是它不應該比任何利用了無論如何都要對數組進行排序的算法都要慢得多:

var myArrayStats = [];
for(var i = myArray.length; i--;)
    myArrayStats[myArray[i]] = (myArrayStats[myArray[i]] || 0) + 1;

console.log(myArrayStats[6]);  // Outputs 7
console.log(myArrayStats[10]); // Outputs 5
console.log(myArrayStats[20]); // Outputs 5

如果只想對原始數組的一部分執行此操作,而不是使用slice()獲取所需的數組部分,然后對該數組執行與上述相同的操作:

var mySubArray = myArray.slice(0,30);
var myArrayStats = [];
for(var i = mySubArray.length; i--;)
    myArrayStats[mySubArray[i]] = (myArrayStats[mySubArray[i]] || 0) + 1;

console.log(myArrayStats[6]);  // Outputs 7
console.log(myArrayStats[9]);  // Outputs 7
console.log(myArrayStats[10]); // Outputs undefined

 myArray = [2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14] for (var a = myArray, b = {}, i = 0; i < myArray.length; i++) b[a[i]] ? b[a[i]]++ : b[a[i]] = 1; console.log(JSON.stringify(Object.keys(b) .map(function(c) { return [c, b[c]] }))); 

聽起來好像您有相等間隔的bin,並希望計算每個中有多少個值。 由於這個問題是用jQuery標記的,因此我們從中使用實用程序函數來避免顯式循環以顯示另一種處理方法。 (我想PaulPRO的方法雖然更好。)

function hist(values, min, max, numBins) {
    var bins = [];
    var range = max - min;
    jQuery.each(values, function(i, value) {
        var bin = Math.floor(numBins * (value - min) / range);
        bin = Math.min(Math.max(bin, -1), numBins) + 1;
        bins[bin] = (bins[bin] || 0) + 1;
    });
    return bins;
}

我們可以使用以下代碼來執行上面的代碼:

function consoleHist(values, min, max, numBins) {
    var bins = hist(values, min, max, numBins);
    var step = (max - min) / numBins;
    jQuery.each(bins, function(i, count) {
        var lower = (i - 1) * step + min;
        var upper = lower + step;
        if (lower < min) {
            lower = -Infinity;
        }
        if (upper > max) {
            upper = Infinity;
        }
        console.log('[' + lower + ', ' + upper + '): ' + (count || 0));
    });
}

consoleHist([-10, 0, 11, 29, 30, 59, 60, 1000], 0, 60, 2);

在控制台上產生以下輸出:

[-Infinity, 0): 1
[0, 30): 3
[30, 60): 2
[60, Infinity): 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM