分享一些常用的数组方法:
压平数组(Array.prototype.contact的妙用)
[].concat.apply([],[[1,2],3,[4,5,6]])
打印: [1, 2, 3, 4, 5, 6]
数组拍平与迭代器的运用
问题描述:编写一个 JavaScript generator 函数,接受一个仅包含数字的 多维数组 ,返回一个迭代器,可以遍历得到它拍平以后的结果。例如:
const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5
答案:
function *flatten2 (arr) {
for(let a of arr) {
Array.isArray(a) ? yield* flatten2(a) : yield a
}
}
数组去重 (es6 set 用法)
[ ...new Set([1, 2, 3, 1, 5]) ]
或者
Array.from(new set([1, 2, 3, 1, 5]))
爬楼梯(斐波那契数列——解构与循环优化递归算法)
问题描述: 有若干阶楼梯,每一次爬一节或者两节,问有多少种方法?
//采用动态规划方案
function climb(n){
if (n == 1) return 1
if (n == 2) return 2
let n1 = 1
let n2 = 2
for(var i = 3; i < n; i++){
[n1, n2] = [n2, n1 + n2]
}
return n1 + n2
}
//传统递归
function fb(n){
if(n == 1 || n == 2){ return n}
return fb(n-1) + fb(n - 2)
}
数组空位填充(数组下标的应用与理解)
问题:JavaScript 数组有空位的概念,也就数组的一个位置上没有任何的值。例如:
[ , , 'Hello'] // => 0, 1 都是空位, 3 不是空位
要求: 把空位都填充为 'Hello’
let arr = [ , undefined, null , 'Hello']
for(var i = 0; i < arr.length; i++){
if(!(i in arr)){
arr[i] = 'Hello'
}
}
console.log(arr)
数组中的数据划分(解构与while)
问题描述:
完成一个函数 partition,它接受一个数组作为参数。它会搬动数组中的元素,使得所有小于第一个项的元素都搬动到它的左边,所有大于第一个项的元素都搬动到右边。例如:
const arr = [3, 1, 6, 2, 4, 5]
partition(arr)
console.log(arr) // => [2, 1, 3, 6, 4, 5]
解析
const partition = (arr) => {
const swap = (a, i, j) => [a[i], a[j]] = [a[j], a[i]] //解构赋值,很常用
const v = arr[0]
let i = 0
let k = 1
let j = arr.length - 1
while(k <= j) {
if(arr[k] < v) swap(arr, i++, k++)
else if(arr[k] > v) swap(arr, j--, k)
else k++
}
}