javascript三元运算符来计算字符串中的字符

时间:2016-02-17 09:40:18

标签: javascript

我最近遇到了这个javascript函数来计算某个字符出现在字符串中的次数。 我可以看到它使用.replace()方法替换任何非空白区域的正则表达式,但我不能完全理解它被替换为什么。

function Char_Counts(str1) {
    var uchars = {};
    str1.replace(/\S/g, function(l) {
        uchars[l] = (isNaN(uchars[l]) ? 1 : uchars[l] + 1);
    });
    return uchars;
}
console.log(Char_Counts("This is a sample string"));

任何人都可以解释一下这个论点" l"这是传递给未命名的函数以及三元运算符内部正在发生的事情,我设法实现与此相同的效果,但使用嵌套for循环,但我甚至无法看到它是如何迭代通过字符串字符。这是控制台中的输出我只想了解到底发生了什么。

Object { T: 1, h: 1, i: 3, s: 4, a: 2, m: 1, p: 1, l: 1, e: 1, t: 1, 3 more… }

2 个答案:

答案 0 :(得分:2)

这样做很不寻常。实际上这种模式更常用。它会获得uchars[l]0的真值,并添加一个。

uchars[l] = (uchars[l] || 0) + 1;

答案 1 :(得分:0)

所以这个功能正在发生什么

function Char_Counts(str1) {  
  //Create an object where we will hold the letters and thier counts
  var uchars = {};

  // Get all non space characters matched with /\S/g regex
  str1.replace(/\S/g, function (l) {

  // here l represents each character as the regex matches it
  // so finally the ternary operator assings to the letter property of our map: if we find the letter for the first time isNaN will return true from isNan(undefined) and we will assing 1 otherwise we will increase the count by 1
  uchars[l] = (isNaN(uchars[l]) ? 1 : uchars[l] + 1);
  });
  return uchars;  
}  

因此,对于在字符串These Ones中运行的示例,正​​则表达式将匹配任何非空格字符,因此TheseOnes,函数中的lT然后{{ 1}}然后h等。

euchars['T'],因此undefinedisNaN(undefined) 所以我们设置true

如果第一个语句为true,则三元运算符返回uchars['T'] = 1;之后的计算表达式,否则返回? 之后的计算表达式

来自MDN

  

条件? expr1:expr2

     

如果condition为true,则运算符返回expr1的值;   否则,它返回expr2的值。

另一种方法是使用:

Array#reduce