题目:www.freecodecamp.cn/challenges/…正则表达式
思路:app
// 初次解法
function largestOfFour(arr) {
return arr.map(item => Math.max(...item));
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
复制代码
结合咱们以前那个找出最长单词测试
// Math.max.apply(null, array)
function largestOfFour(arr) {
return arr.map(item => Math.max.apply(null, item));
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
// Array.sort((a, b) => b - a)[0]
function largestOfFour(arr) {
return arr.map(item => item.sort((a, b) => b - a)[0]);
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
复制代码
而后咱们能够利用 Array.reduce()
去实现一个 Array.map()
因此也能够这样写:ui
// Array.reduce() 实现 Array.map() + Math.max()
function largestOfFour(arr) {
return arr.reduce((acc, val) => acc.concat(Math.max(...val)), []);
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
// 为何用的是 concat() 而不是 push()
// 由于 concat() 返回的是一个数组,而 push() 返回的是 Array.length
// 使用 push() 的话,咱们要手动 return acc 值
// 像这样,否则的话会报错,push is not a function
function largestOfFour(arr) {
return arr.reduce((acc, val) => {
acc.push(Math.max(...val))
return acc
}, []);
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
复制代码
题目:www.freecodecamp.cn/challenges/…spa
博客:singsing.io/blog/fcc/ba…prototype
思路:code
slice()
是能够反向截取的,例如 取数组最后一个元素:Array.slice(-1)
// 初次解法
function confirmEnding(str, target) {
return target === str.slice(-target.length);
}
confirmEnding("Bastian", "n");
复制代码
上面的是反向截取,若是咱们要正向截取呢,那咱们要知道从第几位开始。str.length
和 target.length
相减就 ok 了对象
比较 slice, substr, substring
blog
str.slice(beginSlice[, endSlice])
截取字符串的一部分,返回做为一个新的字符串,不影响原字符串。
beginSlice
默认为 0 ,当为负数时,会加上字符串长度。endSlice
默认为字符串长度,当为负数时,会加上字符串长度。str.substr(start[, length])
返回一个字符串中从指定位置开始到指定字符数的字符。
start
默认为 0 ,当为负数时,会加上字符串长度。str.substring(indexStart[, indexEnd])
// slice
function confirmEnding(str, target) {
return target === str.slice(str.length - target.length);
}
confirmEnding("Bastian", "n");
// substr
function confirmEnding(str, target) {
return target === str.substr(str.length - target.length);
}
confirmEnding("Bastian", "n");
// substring
function confirmEnding(str, target) {
return target === str.substr(str.length - target.length);
}
confirmEnding("Bastian", "n");
复制代码
利用正则表达式,这个真没想过!
RegExp
建立了一个正则表达式对象,用于将文本与一个模式匹配。$
表明从后面匹配RegExp.test()
测试当前正则是否能匹配目标字符串function confirmEnding(str, target) {
return RegExp(`${target}$`).test(str)
}
confirmEnding("Bastian", "n");
复制代码
思路一:
Array(num)
去建立一个数组,该数组中有 num 项Array.fill()
去填充字符串Array.join()
去拼接num
是否小于 0,是的话直接返回空串,注意不能判断是否为真,由于 Number => Boolean
中只有 +0, -0
为 false
function repeat(str, num) {
if (num < 0) return ''
return Array(num).fill(str).join('')
}
repeat("abc", 3);
复制代码
其实嘛,看了博客知道另一种解法,感受是我对 Array.join()
不熟悉的缘由。 Array.join()
把数组的各项用分隔符隔开,拼接成字符串,不传参的话,默认是用逗号隔开。
function repeat(str, num) {
if (num < 0) return ''
return Array(num + 1).join(str) // 注意:num + 1
}
repeat("abc", 3);
复制代码
思路二:直接用 String.repeat
str.repeat(count)
:构造并返回一个新字符串,该字符串为指定数量的字符串的副本。
count
: [0, 正无穷],为 0 时,返回一个空串,非整数时,向下取整。function repeat(str, num) {
if (num < 0) return ''
return str.repeat(num)
}
const repeat = (str, num) => num > 0 ? str.repeat(num) : ''
repeat("abc", 3);
复制代码
题目要求:
num
长,则把多余的部分用...来表示。num
小于或等于3,则添加的三个点号不会计入字符串的长度。思路: 分不一样状况,进行字符串截取和拼接
function truncate(str, num) {
// num 小于等于3时
if (num < 4) {
return str.slice(0, num) + '...';
}
// num 大于字符串长度时
if (num >= str.length) return str;
return str.slice(0, num - 3) + '...';
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
复制代码
使用三元运算符:a ? b : c
function truncate(str, num) {
if (num < str.length) {
return str.slice(0, num > 3 ? num - 3 : num) + '...'
}
return str
}
truncate("A-tisket a-tasket A green and yellow basket", 11)
复制代码
其中 slice
也能够换成 substr
, substring
题目要求:
arr
按照指定的数组大小size
分割成若干个数组块。解题思路:
console.log(Array.prototype)
找到
slice()
splice()
push()
concat()
while
// 由于 splice() 会改变原数组的长度,因此能够直接判断数组长度
function chunk(arr, size) {
var a = []
while(arr.length) {
a.push(arr.splice(0, size))
}
return a
}
chunk(["a", "b", "c", "d"], 2);
// 由于 slice() 不会修改原数组长度,因此用变量 i 去计数
function chunk(arr, size) {
var a = []
var i = 0
while(i < arr.length) {
a.push(arr.slice(i, i + size))
i += size
}
return a
}
chunk(["a", "b", "c", "d"], 2);
// 而后 push 和 concat 的区别就是返回值
// push 返回的是 arr.length
// concat 返回的是 一个新数组
复制代码
题目要求:返回一个数组被截断 n 个元素后还剩余的元素,截断从索引 0 开始。
大概意思就是:给你一个数组,和一个数字 n ,而后你返回这个数组从 0 开始删除掉 n 个元素的数组。
立马就能够想到:splice()
, 换个思路想一想,截取剩余部分的话,那能够有 slice
splice
// splice 解法
function slasher(arr, howMany) {
// 请把你的代码写在这里
arr.splice(0, howMany)
return arr
}
function slasher(arr, howMany) {
// 去掉多余的 arr
return arr.splice(0, howMany) && arr
}
slasher([1, 2, 3], 2);
复制代码
slice
function slasher(arr, howMany) {
return arr.slice(howMany)
}
slasher([1, 2, 3], 2);
复制代码
shift
循环 n 次,这样也能够从 0 开始删除部分数组function slasher(arr, howMany) {
for (let i = 0; i < howMany; i++) {
arr.shift()
}
return arr
}
slasher([1, 2, 3], 2);
复制代码