Bly*_*ons 4 javascript unicode json emoji
我试图在一个文本块中计算表情符号的频率.例如:
"I love so much " -> [{:3}, {:1}]
Run Code Online (Sandbox Code Playgroud)
为了计算一个文本块中字符的频率,我正在使用
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)
来源:https://stackoverflow.com/a/18619975/4975358
^上面的代码很好用,但它不识别表情符号字符:
{?: 1, ?: 3, ?: 2}
Run Code Online (Sandbox Code Playgroud)
另外,我更喜欢输出是长度为1的json对象列表,而不是一个长json对象.
您可以使用String.replace函数的回调和unicode感知RegExp从unicode块"杂项符号"到"象形图传输和映射符号"(0x1F300到0x1F6FF)的所有内容:
let str = "I love so much ";
let freq = {};
str.replace(/[\u{1F300}-\u{1F6FF}]/gu, char => freq[char] = (freq[char] || 0) + 1);
console.log(freq);Run Code Online (Sandbox Code Playgroud)
如果您希望避免RegExp或String.replace,您可以将字符串解构为数组并将其减少到以下频率:
let str = "I love so much ";
let freq = [...str].reduce((freq, char) => {
if (char >= '\u{1F300}' && char < '\u{1F700}') freq[char] = (freq[char] || 0) + 1;
return freq;
}, {});
console.log(freq);Run Code Online (Sandbox Code Playgroud)
小智 6
charAt这里帮不了你。for...of将正确地将字符串解析为 Unicode 代码点,包括星体层中的代码点。我们用来character.length确定这是否是一个补充平面字符。如果你真的想知道它是否是表情符号,你需要加强这一点。
const input = "I love so much ";
function getFrequency(string) {
var freq = {};
for (character of string) {
if (character.length === 1) continue;
if (freq[character]) {
freq[character]++;
} else {
freq[character] = 1;
}
}
return freq;
};
console.log(getFrequency(input));Run Code Online (Sandbox Code Playgroud)
要创建单值对象数组,请通过以下方式运行输出:
function breakProperties(obj) {
return Object.keys(obj).map(function(key) {
var result = {};
result[key] = obj[key];
return result;
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |