我需要编写某种循环来计算字符串中每个字母的频率.
例如:"aabsssd"
输出:a:2,b:1,s:3,d:1
还想在对象中将相同的字符映射为属性名称.有什么好主意怎么做?
我不知道该怎么做.
这是我到目前为止的地方:
var arr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
function counter(x) {
var count=0, temp = [];
x = x.split('');
console.log(x);
for(var i=0, len = x.length; i < len; i++) {
if(x[i] == "a") {
count++;
}
}
return count;
}
var a = "aabbddd";
console.log(counter(a));
Run Code Online (Sandbox Code Playgroud)
Jon*_*owe 21
干得好:
function getFrequency(string) {
var freq = {};
for (var i=0; i<string.length;i++) {
var character = string.charAt(i);
if (freq[character]) {
freq[character]++;
} else {
freq[character] = 1;
}
}
return freq;
};
Run Code Online (Sandbox Code Playgroud)
rus*_*mer 12
一些带有reduce的ES6语法:
let counter = str => {
return str.split('').reduce((total, letter) => {
total[letter] ? total[letter]++ : total[letter] = 1;
return total;
}, {});
};
counter("aabsssd"); // => { a: 2, b: 1, s: 3, d: 1 }
Run Code Online (Sandbox Code Playgroud)
另一种方案:
function count (string) {
var count = {};
string.split('').forEach(function(s) {
count[s] ? count[s]++ : count[s] = 1;
});
return count;
}
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
const freqMap = s => [...s].reduce((freq,c) => {freq[c] = -~freq[c]; return freq} ,{})
Run Code Online (Sandbox Code Playgroud)
或者,如果您更喜欢“for”循环:
function freqMap(s) {
freq={};
for (let c of s)
freq[c]=-~freq[c];
return freq;
}
Run Code Online (Sandbox Code Playgroud)
例如freqMap("MaMaMia")退货Object{M : 3, a : 3, i : 1}
此方法利用了这样一个事实:在 javascript 中,按位非“未定义”给出 -1(而“未定义+1”给出 NaN)。所以,-~undefined是1,-~1是2,-~2是3等等。
因此,我们可以迭代字符串的字符,并且简单地递增而freq[c]无需任何“if”。第一次遇到字符c,freq[c]是未定义的,所以我们将其设置为-~freq[c]is 1。如果我们随后c再次遇到,我们再次设置freq[c]为-~freq[c],现在将是2,等等。
简单、优雅、简洁。
使用一些 ES6 特性和短路:
const counter = s => [...s].reduce((a, c) => (a[c] = a[c] + 1 || 1) && a, {})
console.log(
counter("hello") // {h: 1, e: 1, l: 2, o: 1}
) Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36599 次 |
| 最近记录: |