2016-04-28 19 views
1

我有一個這樣的陣列,我想count每個元件的頻率計數元件的occurances在一個陣列中的JavaScript

var arr = [1, 5, 7, -1]; 
function countArray (arr){ 
    var map = []; 
    for (var i =0; i < arr.length ; i++){ 
     map[arr[i]]++; 
    } 
    console.log(map); 
} 

console.log打印[1: NaN, 5: NaN, 7: NaN, -1: NaN]

我預期它打印[1: 1, 5: 1, 7: 1, -1: 1]

我不明白爲什麼我得到NaN

+1

在做之前''++,你需要初始化值'0'。否則,你在做'null + 1',這是NaN(不是數字)。你可以通過在'for'循環的開頭加上if(!map.hasOwnProperty(arr [i])){map [arr [i]] = 0來解決這個問題。 }' – blex

+0

...你是DJ嗎? –

+0

@JoshKG我是單身媽媽的學習編程。 –

回答

4

好,如果這是第一次發生,那麼你會嘗試增加一個未定義的。因此,首先檢查它是否未定義,然後分配0或增加它。你應該使用一個對象而不是數組。該對象有一個keyvalueArray是一組有序的元素,通過它們的數字索引進行訪問。

我在編輯這個來解釋你的可以使用Array對象。如果索引的值大於數組中的最大索引,則將調整其大小。不過,我認爲一個對象更好用,因爲將來如果使用其他類型的鍵(不是數字),那麼代碼將不需要任何更改。

var arr = [1, 5, 7, -1]; 
function countArray (arr) { 
    var map = {}; 
    for (var i =0; i < arr.length ; i++){ 
     map[ arr[i] ] = typeof map[ arr[i] ] === 'undefined' ? 1 : ++map[ arr[i] ]; 
    } 
    console.log(map); 
} 
+0

或者:'map [arr [i]] =(map [arr [i]] || 0)+ 1'。 –

+0

這似乎是一個很好的習慣用法 –

0

您應該檢查數組是否已經包含密鑰,您可以使用「in」來做到這一點。

var arr = [1, 5, 7, -1, -1]; 
function countArray (arr){ 
    var map = []; 
    for (var i =0; i < arr.length ; i++){ 
     if (arr[i] in map) map[arr[i]]++; 
     else map[arr[i]] = 1; 
    } 
    console.log(map); 
} 
countArray (arr) 

輸出:

[1:1,5:1,7:1,-1:2]

+0

如果使用與Object原型中的屬性名稱相匹配的元素,這會導致問題。如果您使用'in',則應通過執行'hasOwnProperty'檢查來篩選結果。考慮到OP只是學習,我也不能推薦遵循你的條件的「inline」風格。 – Carcigenicate

2

你的功能是好的,但可以用做陣列它。降低一個班輪:

var arr = [1, 5, 7, -1, 1,1]; 
 

 
var r = arr.reduce((ac, x) => { if (!ac[x]) ac[x] = 0; return ac[x]++, ac},{}); 
 

 
document.write(JSON.stringify(r))

選擇任何你找到更易讀..

+1

我只是把我的單線放在這裏,所以你不會孤單:'xs.reduce((acc,x)=> Object.assign(acc,{[x]:(acc [x] || 0)+ 1}),{});' –

+2

除非另有說明,否則請在回答這樣的問題時使用ES5語法,以獲得最大的瀏覽器兼容性。(所有主流瀏覽器都不支持IE功能(IE 11,例如Windows 7上可用的IE最高版本,仍然被廣泛使用)。 – blex

+1

@blex和可讀性更差 –

相關問題