这篇是跟着 FCC 的 JS 数据结构和算法基础题走的时候的一些记录.
数据结构和一些简单算法
-
使用数组
-
按值复制数组, 可以使用
[...数组名]:
let newArr = [...newArray]; console.log(newArr);
- 可以使用
[...数组名]将某数组的元素插入到相应的位置:
let aArray = [1, 2, 3, 4]; let newArray = [1, 5, 1, 10, ...aArray]; console.log(newArray); // 输出[ 1, 5, 1, 10, 1, 2, 3, 4 ]
下面是一些简单的算法:
摄氏转华氏:
function getFahrenheitFrom(celsius) { if ((typeof celsius) != 'number') { throw Error('无法转换非数值类型参数'); } return celsius * 9.0 / 5.0 + 32.0; }
字符串反转:
function reverseString(str) { if (str == undefined || str == null) { return null; } if ((typeof str) != 'string') { throw Error('参数非字符串类型'); } return str.split('').reverse().join(''); }
阶乘:
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; }
阶乘递归版本:
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); }
字符串反转的递归版本:
// 这个的递归模式就是最后一个加上前面剩余的反转. 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)) }
找字符串中的最长单词:
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]; }
找数组中最大值: 挨个判断过去即可
function max(arr) { return arr.reduce((prev, current, arr) => { if (prev >= current) { return prev; } return current; }); }
找字符串中是否以某字符串结尾:
function endWith(str, end) { // ES6 提供了这个函数可用 // return str.endsWith(end); // 若不是 ES6, 则: 使用 RegExp 对象可以将模式用字符串表示. let regex = new RegExp(`${end}$`, 'ig'); return regex.test(str); }
字符串超长后截取指定长度, 超长部分以 ... 代替: 使用 substring 就可以达到目的.
判断某个值是否为布尔值:
function booWho(value) { if (value == null || value == undefined) { return false; } let type = typeof value; if (type != "boolean") { return false; } return true; }
可以使用如下方式验证:
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);
将某个字符串中的所有单词首字母大写, 其余小写:
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 的含义(在逻辑表达式中):
false, null, 0, "", undefined, NaN.
则从数组中过滤掉这些值, 只需要用逻辑判断即可:
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);
输出如下所示:
[ 1, 2, 0, 8, undefined, null, 0, '', NaN ] [ 1, 2, 8 ]
在做数组分若干份的时候还涨了一次知识. 9 个空挡放 3 块板的抽象, 就是选空挡插板.
如何记录这些过程, 通过一个简单的 todo list 来做的话应该如何进行? 这种记录在移动端的记录难度比较大, 主要还是输入太费劲, 在 pc 端倒是非常好, 但是需要使用 web 的方式方便保存查看和随时添加, 这样的话也可以扩展到移动端, 因为直接就可以在网页上访问.