0103---08课堂案例

66 阅读2分钟

统计 字符串中 每个字符出现的次数 (以对象的形式存储)

    str === 'abcabcdef'

计算完毕后的对象:

    {
                   a: 2,
                   b: 2,
                   c: 2,
                   d: 1,
                   e: 1,
                   f: 1
               }
      
           str = 'qqqewq'
               
           {
               q: 4,
               e: 1,
               w: 1
           }

`

    var str = 'aaabbbccddeeee'
    var obj = {}

    console.log(obj['a'])   // undefined
    1. 通过 循环, 拿到字符串中每个位置的值
    半成品
    for (var i = 0; i < str.length; i++) {
        var key = str[i]
        if (obj[key] === undefined) {
            obj[key] = 1
            /**
             *  obj ->  全局声明的空对象
             *  key -> 在循环内部创建的一个变量, 内部的值 就是 str[i]
             *  str[i] -> 字符串对应下标的值
             *
             *  假设当前循环为 第一轮循环       i === 0     str[i] === 'a'      key === 'a'
             *      obj[key] -> obj['a']    ->  此时得到的值应该是 undefined
            */
        }
     // }
     

`

    /**
     *  第 1 轮
     *      i === 0     str[i] === 'a'      key === 'a'     obj = {}
     * 
     *          obj[key] === undefined      obj[key]   ->   obj['a']   ->   undefined
     *          if 条件成立, obj[key] = 1   -> obj['a'] = 1
     *          第 1 轮结束后的 obj === {a: 1}
     * 
     *  第 2 轮
     *      i === 1     str[i] === 'a'      key === 'a'     obj = {a: 1}
     * 
     *          obj[key] === undefined      obj[key]   ->   obj['a']   ->   1
     *          if 条件失败, 开始下一轮循环
     *          第 2 轮结束后的 obj === {a: 1}
     * 
     *  第 3 轮
     *      i === 2     str[i] === 'a'      key === 'a'     obj = {a: 1}
     * 
     *          obj[key] === undefined      obj[key]   ->   obj['a']   ->   1
     *          if 条件失败, 开始下一轮循环
     *          第 3 轮结束后的 obj === {a: 1}
     * 
     *  第 4 轮
     *      i === 3     str[i] === 'b'      key === 'b'     obj = {a: 1}
     * 
     *          obj[key] === undefined      obj[key]   ->   obj['b']   -> undefined
     *          if 条件成立, obj[key] = 1       -> obj['b'] = 1
     *          第 4 轮结束后的 obj === {a: 1, b: 1}
    */
    
    var str = 'aaabbbccddeeeea'
    var obj = {}

基础版

     for (var i = 0; i < str.length; i++) {
         var key = str[i]
         if (obj[key] === undefined) {
             obj[key] = 1
         } else {
             obj[key]++
         }
     }

    /**
     *  第 1 轮
     *      i === 0     str[i] === 'a'      key === 'a'     obj === {}
     * 
     *          obj[key] === undefined      obj[key]   ->   obj['a']   ->   undefined
     *          if 条件成立, 执行 if 分支, else 分支不再执行
     *          obj[key] = 1        obj['a'] = 1
     *          第 1 轮 循环结束后 obj === {a: 1}
     * 
     *  第 2 轮
     *      i === 1     str[i] === 'a'      key === 'a'     obj === {a: 1}
     * 
     *          obj[key] === unedfined      obj[key]    ->   obj['a']   ->   1
     *          if 条件不成立, 执行 else 分支
     *          obj[key]++      obj['a']++
     *          第 2 轮循环结束后 obj === {a: 2}
     * 
     *  第 3 轮
     *      i === 2     str[i] === 'a'      key === 'a'     obj === {a: 2}
     * 
     *          obj[key] === unedfined      obj[key]    ->   obj['a']   ->   2
     *          if 条件不成立, 执行 else 分支
     *          obj[key]++      obj['a']++
     *          第 3 轮循环结束后 obj === {a: 3}
     * 
     *  第 4 轮
     *      i === 3     str[i] === 'b'      key === 'b'     obj === {a: 3}
     * 
     *          obj[key] === unedfined      obj[key]    ->   obj['b']   ->   undefined
     *          if 条件成立, 执行 if 分支, else 分支不再执行
     *          obj[key] = 1        obj['b'] = 1
     *          第 4 轮循环结束后 obj === {a: 3, b: 1}
    */
    

优化版

    for (var i = 0; i < str.length; i++) {
        // var key = str[i]
        // if (obj[str[i]] === undefined) {    // obj[str[i]] === undefined 的时候 做某些事
        if (!obj[str[i]]) {
            /**
             *  因为 undefined 转换为布尔值是 false, 
             * 
             *  所以如果 obj[str[i]] 的值就是 undefined 的时候
             *      那么布尔值就是 false, 加一个 ! 代表取反, 所以实际得到的布尔值 为 ture
             * 
             *  obj[str[i]] 要么是 undefined 要么是从1开始的数字
             * 
             *      所以除了 是 undefined之外的其他情况他的布尔值都是 true
             * 
             *      加一个 ! 代表取反, 所以实际的到的布尔值 为 false
            */
            obj[str[i]] = 1
        } else {
            obj[str[i]]++
        }
    }
    for (var i = 0; i < str.length; i++) {
        if (!obj[str[i]]) {
            obj[str[i]] = 1
        } else {
            obj[str[i]]++
        }
    }

    console.log(obj)