# compact
# Description
创建一个新数组,包含原数组中所有的非假值元素。例如 false, null,0, "", undefined, 和 NaN 都是被认为是 “假值”。
# Params
{Array} array
# Return
Array
# Code
function compact(array) {
let resIndex = 0
const result = []
if (array == null) {
return result
}
for (const value of array) {
if (value) {
result[resIndex++] = value
}
}
return result
}
# Analyze
- 定义一个新数组用作返回,定义新数组下标从0开始
- 判断如果传入的 array == null (兼容了undefined),就返回结果,也就是空数组
- 使用 for...of 对于 array 进行遍历,拿到真值之后,赋值给 result 对应的下标,同时递增下标,最终返回 result
# Remark
- for...of (opens new window) 语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
- 这里如果是纯数组,可以使用 Array.prototype.filter() MDN (opens new window) 等方法来处理,compact 不同的点在于,使用了 for...of ,对于 for...of 支持的可迭代对象 它都可以处理
# Example
const a = new Map
for (let i=0;i<10;i++) {
a.set(i, i*2)
}
compact('abcdefg') // [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]
compact(a) // [ [ 0, 0 ], [ 1, 2 ], [ 2, 4 ], [ 3, 6 ], [ 4, 8 ], [ 5, 10 ],[ 6, 12 ], [ 7, 14 ], [ 8, 16 ], [ 9, 18 ]]
compact([0, 1, false, 2, '', 3]) // [1, 2, 3]