这篇是跟着 FCC 的 JS 数据结构和算法基础题走的时候的一些记录.

数据结构和一些简单算法

  1. 使用数组

  2. 按值复制数组, 可以使用 [...数组名]:

js
let newArr = [...newArray];
console.log(newArr);
  1. 可以使用 [...数组名] 将某数组的元素插入到相应的位置:
js
let aArray = [1, 2, 3, 4];
let newArray = [1, 5, 1, 10, ...aArray];
console.log(newArray); // 输出[ 1, 5, 1, 10, 1, 2, 3, 4 ]

下面是一些简单的算法:

摄氏转华氏:

js
function getFahrenheitFrom(celsius) {
    if ((typeof celsius) != 'number') {
        throw Error('无法转换非数值类型参数');
    }
    return celsius * 9.0 / 5.0 + 32.0;
}

字符串反转:

js
function reverseString(str) {
    if (str == undefined || str == null) { return null; }
    if ((typeof str) != 'string') { throw Error('参数非字符串类型'); }
    return str.split('').reverse().join('');
}

阶乘:

js
function factorialize(num) {
    if (num == null || num == undefined) { return null; }
    let type = typeof num;
    if (type != "number") { return null; }
    if (num == 0) { return 1; }
    let result = 1;
    for (let i = 1; i <= num; ++i) {
        result *= i;
    }
    return result;
}

阶乘递归版本:

js
function factorialize(num) {
    if (num == null || num == undefined) { return null; }
    let type = typeof num;
    if (type != "number") { return null; }
    if (num == 0) { return 1; }
    return num * factorialize(num - 1);
}

字符串反转的递归版本:

js
// 这个的递归模式就是最后一个加上前面剩余的反转.
function reverseString(str) {
    if (str == null || str == undefined) { return ""; }
    let type = typeof str
    if (type != "string") { return ""; }
    if (str.length == 1) { return str; }
    // 怎么表示前面剩余的字符串? 通过 substring 获取从开始index到结尾 index前闭后开区间的子串.
    let length = str.length;
    return str[length - 1] + reverseString(str.substring(0, length - 1))
}

找字符串中的最长单词:

js
function findLongestWordAmong(str) {
    let regex = /\w+/ig
    let lengthArr = str.split(' ')
    .map((value, index, arr) => {
        return value.length;
    })
    .sort((a, b) => a < b);
    return lengthArr[0];
}

找数组中最大值: 挨个判断过去即可

js
function max(arr) {
    return arr.reduce((prev, current, arr) => {
        if (prev >= current) { return prev; }
        return current;
    });
}

找字符串中是否以某字符串结尾:

js
function endWith(str, end) {
    // ES6 提供了这个函数可用
    // return str.endsWith(end);
    // 若不是 ES6, 则: 使用 RegExp 对象可以将模式用字符串表示.
    let regex = new RegExp(`${end}$`, 'ig');
    return regex.test(str);
}

字符串超长后截取指定长度, 超长部分以 ... 代替: 使用 substring 就可以达到目的.

判断某个值是否为布尔值:

js
function booWho(value) {
    if (value == null || value == undefined) { return false; }
    let type = typeof value;
    if (type != "boolean") { return false; }
    return true;
}

可以使用如下方式验证:

js
let a = true;
let b = false;
let aa = "true";
let bb = "false";

console.assert(booWho(a) === true);
console.assert(booWho(b) === true);

console.assert(booWho(aa) === false);
console.assert(booWho(bb) === false);

将某个字符串中的所有单词首字母大写, 其余小写:

js
function titleCase(str) {
    let lower = str.toLowerCase();

    // 将字符串分割
    let arr = lower.split(' ');

    // 将每个单词首字母大写:
    for (let i = 0; i < arr.length; ++i) {
        arr[i] = uppercasedStart(arr[i]);
    }
    return arr.join(' ');
}

function uppercasedStart(word) {
    if (word.length <= 0) { return ""; }
    if (word.length == 1) { return word.toUpperCase(); }
    return word[0].toUpperCase() + word.substring(1, word.length);
} 

在 JS 中有如下的量都代表 false 的含义(在逻辑表达式中):

js
false, null, 0, "", undefined, NaN.

则从数组中过滤掉这些值, 只需要用逻辑判断即可:

js

let containsFalsyValueArray = [1, 2, 0, 8, undefined, null, 0, "", NaN];

console.log(containsFalsyValueArray);

let pureArray = containsFalsyValueArray.filter((value, index, arr) => {
    return value;
})

console.log(pureArray);

输出如下所示:

js
[ 1, 2, 0, 8, undefined, null, 0, '', NaN ]
[ 1, 2, 8 ]

在做数组分若干份的时候还涨了一次知识. 9 个空挡放 3 块板的抽象, 就是选空挡插板.

如何记录这些过程, 通过一个简单的 todo list 来做的话应该如何进行? 这种记录在移动端的记录难度比较大, 主要还是输入太费劲, 在 pc 端倒是非常好, 但是需要使用 web 的方式方便保存查看和随时添加, 这样的话也可以扩展到移动端, 因为直接就可以在网页上访问.