2013-04-30 56 views
1

我正在尋找基於不同數組內相同對象的出現來創建計數數組。到目前爲止,我的代碼看起來是這樣的:計數數組對象的出現

var dates = []; 
$.each(items, function (i, item) { 
    dates.push(item.date); 
}); 

返回:

['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09'] 

在那之後,我想有一個數組,看起來像這樣結束了:

[2,1,1,3] 

任何幫助將不勝感激!

回答

1

我會用一個鍵/值計數的方法,把日期是鍵和值的次數看起來​​就像這樣:將全部以下相同格式

var counters = {}; 
$.each(dates, function(i, date) { 
    counters[date] = counters[date] ? counters[date] + 1 : 1; 
}); 

這種方法假設日期當然。

編輯:

http://jsfiddle.net/wMR9x/2/

然後你可以遍歷它像這樣,只是加入了結果到另一個數組:

var finalCounts = []; 
var i = 0; 
for(var key in counters) 
    finalCounts[i++] = counters[key]; 
+0

不應該'計數器'是一個對象,而不是一個數組。這項行動的結果將不是OP要求的。它不會是'[2,1,1,3]',因爲它們是索引爲'0','1','2'等的實際數組項。 – jfriend00 2013-05-01 00:41:04

+0

@ jfriend00'counters'可以被聲明爲一個對象,但它並沒有真正改變太多,因爲數組是一個對象,並且我沒有調用'counters.length',它會返回零長度,但我會改變爲了清楚起見。 = D此外,如果你說'counters'不具有OP後面的格式,但是如果你看一下'finalCounts',那個變量將包含'[2,1,1,3]'就像OP提供的jsfiddle所要求的那樣。 – 2013-05-01 01:25:22

+0

您的'finalCounts'版本沒有任何特定的保證順序。因爲對象中的迭代鍵沒有保證順序。我在回答中遇到了更多麻煩的原因是爲了保證輸出數組的順序與原始數據中鍵的順序相匹配。 – jfriend00 2013-05-01 04:34:17

0

嘗試

var src = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; 

var cnts = []; 
for(var i = 0; i < src.length; i++){ 
    var val = src[i]; 
    var count = 1; 
    while(val == src[i + 1]){ 
     count++; 
     i++; 
    } 
    cnts.push(count) 
} 

演示:Fiddle

0

您可以通過使用地圖來跟蹤你已經看到了這樣的價值觀的有效計數的重複值:

var data = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; 

var map = {}; 
var sequence = []; 
for (var i = 0; i < data.length; i++) { 
    var item = data[i]; 
    if (map[item]) { 
     map[item]++; 
    } else { 
     map[item] = 1; 
     sequence.push(item); 
    } 
} 

var output = []; 
for (i = 0; i < sequence.length; i++) { 
    output.push(map[sequence[i]]); 
} 

// output contains [2,1,1,3] 

工作演示:http://jsfiddle.net/jfriend00/rQ7KB/

0

您可以使用推的JavaScript陣列的方法來實現這一

var arr = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; 
var x = [],y = [], prev; 
for (var i = 0; i < arr.length; i++) { 
    if (arr[i] !== prev) { 
     x.push(arr[i]); 
     y.push(1); 
    } else { 
     y[y.length - 1]++; 
    } 
    prev = arr[i]; 
} 
console.log(y); 

JSFiddle

1
var dates=['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; 
var count={}; 
var count_array=[]; 
for (i in dates){ 
    count[dates[i]] =count[dates[i]]?count[dates[i]]+1:1; 
} 

for (i in count){ 
    count_array.push(count[i]); 
} 
console.log(count_array); 

jsfiddle

1

嘗試countBy功能underscore.js:

_.countBy(dates,_.identity); 

如果你想找回剛剛將返回的形式

{'2013/03':2, ...} 

的對象來自該對象的計數,請使用_.values函數。