Javascript:计算文本

时间:2017-06-29 19:00:34

标签: javascript json unicode emoji

我试图在一个文本块中计算表情符号的频率。例如:

"I love  so much  " -> [{:3}, {:1}]

为了计算一个文本块中字符的频率,我使用

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;
};

来源:https://stackoverflow.com/a/18619975/4975358

^上面的代码效果很好,但它无法识别表情符号字符:

{�: 1,  �: 3,  �: 2}

另外,我更喜欢输出是长度为1的json对象列表,而不是一个长json对象。

2 个答案:

答案 0 :(得分:7)

您可以使用String.replace函数的回调和识别unicode RegExp来检测unicode块&#34;杂项符号&#34; &#34;象形文字传输和映射符号&#34; (0x1F300到0x1F6FF):

&#13;
&#13;
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);
&#13;
&#13;
&#13;

如果您希望避免使用RegExpString.replace,则可以将字符串解构为数组并将其减少到以下频率:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:4)

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));

要创建单值对象数组,请通过以下命令运行输出:

function breakProperties(obj) {
  return Object.keys(obj).map(function(key) {
    var result = {};
    result[key] = obj[key];
    return result;
  });
}