当我找到这个答案时,我正在寻找一种返回数组模式的方法:
var store = ['1','2','2','3','4'];
var frequency = {}; // array of frequency.
var max = 0; // holds the max frequency.
var result; // holds the max frequency element.
for(var v in store) {
frequency[store[v]]=(frequency[store[v]] || 0)+1; // increment frequency.
if(frequency[store[v]] > max) { // is this frequency > max so far ?
max = frequency[store[v]]; // update max.
result = store[v]; // update result.
}
}
这段代码完美无瑕,而且我理解得很清楚,我能够输出最常见的值和值出现的次数。但是,这个代码块对我来说毫无意义。特别是这一行:
frequency[store[v]]=(frequency[store[v]] || 0)+1;
我认为频率是一个数组,商店[v]作为索引。这个代码块究竟发生了什么?
答案 0 :(得分:1)
首先,浏览this tutorial以了解Javascript数组和Javascript对象之间的差异。然后你会读到这样的代码:
var store = ['1','2','2','3','4']; // store[0] == '1', store[1] = '2', etc.
var frequency = {}; // array of frequency. // frequency.'1' = undefined
然后,当分配发生时,它更容易理解。 frequency[store[v]]
只是frequency.'1'
v == 0
,意味着您正在访问对象frequency
及其字符串1
命名的字段。 javascript对象可以具有任何名称的字段,例如frequency.'apple'
,frequency.'table'
等。在您给予价值之前,它们只是未定义。
然后,分配更容易阅读
if (frequency.'1' is undefined)
store the value [0 + 1] into frequency.'1'
else increment the value by 1