我需要编写某种循环来计算字符串中每个字母的频率。
例如:“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));
答案 0 :(得分:19)
你走了:
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;
};
答案 1 :(得分:9)
一些带有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 }
答案 2 :(得分:6)
另一种解决方案:
function count (string) {
var count = {};
string.split('').forEach(function(s) {
count[s] ? count[s]++ : count[s] = 1;
});
return count;
}
答案 3 :(得分:2)
获得单词直方图的更多声明性方法是利用reduce来迭代字母并提出一个新对象,其中包含字母作为键和频率作为值。
function getFrequency(str) {
return str.split('').reduce( (prev, curr) => {
prev[curr] = prev[curr] ? prev[curr] + 1 : 1;
return prev;
}, {});
};
console.log(getFrequency('test')); // => {t: 2, e: 1, s: 1}
答案 4 :(得分:1)
还有一个按字母顺序排序的版本。此功能适用于两者。
警告:仅当整个字符串为小写时才有效
function freqWithAlphabetTable(str, doNeedToSort) {
let cnt = new Array(26).fill(0), firstLowerCase = 97, output = {}
for (let i = 0; i < str.length; i++)
cnt[str[i].charCodeAt(0) - firstLowerCase]++ // filling the array with count at it's index
if (doNeedToSort) {
for (let i = 0; i < cnt.length; i++) {
if (cnt[i] !== 0)
output[String.fromCharCode(firstLowerCase)] = cnt[i]
firstLowerCase++;
}
} else {
for (let i = 0; i < str.length; i++) {
let letterIndexVal = cnt[str[i].charCodeAt(0) - firstLowerCase];
if (letterIndexVal != 0 ) {
output[str[i]] = letterIndexVal
letterIndexVal = 0 // replacing it with zero to avoid repetition
}
}
}
console.log(output);
return output;
}
答案 5 :(得分:0)
另一种解决方案
function maxChar(str) {
const charMap = {};
let max = 0;
let maxChar = '';
for(let char of str){
if(charMap[char]){
charMap[char]++;
}else{
charMap[char] = 1;
}
}
for(let char in charMap){
if(charMap[char] > max){
max = charMap[char];
maxChar = char;
}
}
return maxChar;
}
===>
maxChar('355385') "5"
答案 6 :(得分:0)
[...str].map( char => map.get(char) ? map.set( char, map.get(char) + 1) : map.set(char,1) )
答案 7 :(得分:0)
新的JS功能的混合和一些短路。
const counter = s => [...s].reduce((a,c)=>(a[c]=a[c]+1 || 1)&&a, {})
counter("hello") // {h: 1, e: 1, l: 2, o: 1}
答案 8 :(得分:0)
我已经进行了审查,我认为这非常适合他们提出的需求。我希望将其放在一行中,但是我不知道如何动态生成对象。
const uniqueCount=(arr)=>{
let rs ={};
arr.sort().join("").match(/(.)(\1*)/g).map(i=>rs[i[0]]=i.length);
return rs;
};
console.log(uniqueCount(["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"]));
//{ a: 3, b: 2, c: 2, d: 2, e: 2, f: 1, g: 1, h: 3 }
如上所述,我发现使用.match()
和正则表达式/(.)(\1*)/g
非常成功。
如果只是一个字符串,只需要在前面添加一个.split("")
就可以了。
答案 9 :(得分:0)
一种简单的方法。此外,它还为您提供了按字母顺序排序的列表。它会遍历一个错误并评估角色中是否已存在该字符:如果为false,则将该字符添加到该对象中;如果为true,则其频率会增加一个单位。
const text= "Lorem ipsum dolor sit amet consectetur adipiscing"
const textAsArray = text.split('').sort()
let charactersList = {}
for (char of textAsArray) {
if (!charactersList[char]) {
charactersList[char]=1;
}
else {
charactersList[char]++
}
}
console.log(charactersList)
答案 10 :(得分:0)
用来计算字符串中字符的频率的欺诈代码是
let target = "e";
let string = " i want to see that person that came in here last";
let frequency = string.split(target).length;
或全部一行
console.log(string.split("e").length)
答案 11 :(得分:0)
您可以使用它。只需传递字符串,它将返回具有所有字符频率的对象。
function buildCharMap(string) {
const charMap = {};
string.replace(/[^\w]/g, '').toLowerCase();
for (let char of string) {
charMap[char] = charMap[char] + 1 || 1;
}
return charMap;
}
答案 12 :(得分:0)
相同的解决方案,但可以重构。很酷,我们如何用这么多不同的答案来解决这个问题:)
.desc
答案 13 :(得分:0)
var str = 'abcccdddd';
function maxCharCount(target) {
const chars = {};
let maxChar = '';
let maxValue = 1;
for (let char of target) {
chars[char] = chars[char] + 1 || 1;
}
return chars;
}
console.log(maxCharCount(str));
答案 14 :(得分:0)
// Count frequency of characters in a string
// input: 'Hello, I'm Paul!'
// result: {
// H: 1,
// E: 1,
// L: 3,
// ... and so on ...
// }
const countChars = (string) => {
let charStats = {};
string = string.replace(' ', '').toUpperCase().split('');
string.forEach((char) => {
if (charStats[char]) {
charStats[char]++;
} else {
charStats[char] = 1;
}
});
return charStats;
};
答案 15 :(得分:0)
更精简,更实用的解决方案:
$(document).ready(function(){
$(".dropdown, .btn-group").hover(function(){
var dropdownMenu = $(this).children(".dropdown-menu");
if(dropdownMenu.is(":visible")){
dropdownMenu.parent().toggleClass("open");
}
});
});
有关详细信息,请参阅 计算对象中值的实例 ,在此处显示页面的一半:MDN Reduce
有关使用 逻辑运算符 的详细信息,请参阅此处:MDN Logical Operators
答案 16 :(得分:0)
这是另一种方式:
const freqMap = s => [...s].reduce((freq,c) => {freq[c] = -~freq[c]; return freq} ,{})
或者,如果您更喜欢“for”循环:
function freqMap(s) {
freq={};
for (let c of s)
freq[c]=-~freq[c];
return freq;
}
e.g。 freqMap(“MaMaMia”)返回Object {M:3,a:3,i:1}
这种方法利用了这样的事实:在javascript中,按位而不是“undefined”给出-1,(而“undefined + 1”给出NaN)。 所以,~~ undefined是1, - ~1是2, - 〜2是3等。
因此我们可以遍历字符串的字符,只需增加freq [c]而不使用任何“if”。我们第一次遇到一个字符c时,freq [c]将是未定义的,所以我们将它设置为 - ~freq [c],这是1.如果我们再次遇到c,我们再次将freq [c]设置为 - ~freq [c],现在将是2,等等。
简洁,优雅,简洁。
答案 17 :(得分:0)
const recorrences = ['a', 'b', 'c', 'a', 'b','a']
.map(i => !!~i.indexOf('a'))
.filter(i => i)
.length;
console.log(`recorrences ${recorrences}`)
//recorrences 3
&#13;
答案 18 :(得分:0)
for(i = strlen(string)var string = 'aabsssd';
var chars = new Array();
for(var i = 0; i < string.length; i++){
var char = string.charAt(i);
if(chars[char] == undefined){
chars[char] = 0;
}
chars[char]++;
}
console.log(chars);
答案 19 :(得分:0)
这是使用underscore.js的另一个选项:
function charCount(str) {
return _(str.split('')).countBy(function(char) {
return char.toLowerCase();
});
}
charCount('aaabbbbdd')
输出Object {a: 3, b: 4, d: 2}