统计 字符串中 每个字符出现的次数 (以对象的形式存储)
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)