383.赎金信

/**
 * 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function (ransomNote, magazine) {
    // 先记录第一个字符串字母出现次数
    let map = {}
    for (let i = 0; i < ransomNote.length; i++) {
        if (map[ransomNote[i]]) {
            ++map[ransomNote[i]]
        } else {
            map[ransomNote[i]] = 1
        }
    }
    // 用第二个字符串字母进行填充,填充一个map里面就次数就减1
    let arr = magazine.split('')
    for (let i = 0; i < arr.length; i++) {
        if (map[magazine[i]]) {
            --map[magazine[i]]
        }
    }
    let values = Object.values(map)
    return !values.filter(e => e > 0).length
};

console.log(canConstruct('a', 'b'))
console.log(canConstruct('aa', 'ab'))
console.log(canConstruct('aa', 'aab'))