本文翻译自 Chalarangelo
的 30 seconds of code
- Array
一节,并添加自己的学习笔记
不定期更新
转载请注明
Array
chunk
把一个数组分块成指定大小的小数组。
使用 Array.from()
创建一个新的数组,它适合将要生成的块的数量。 使用 Array.slice()
将新数组的每个元素映射到长度为 size
的块。如果原始数组不能均匀分割,最后的块将包含剩余的元素。1
2
3
4const chunk = (arr, size) =>
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size)
);
Examples
1 | chunk([1, 2, 3, 4, 5], 2); // [[1,2],[3,4],[5]] |
Notes
Array.from()
语法
>
Array.from(arrayLike, mapFn, thisArg)
> 参数
>> arrayLike
>>> 想要转换成数组的伪数组对象或可迭代对象。
>> mapFn (可选参数)
>>> 如果指定了该参数,新数组中的每个元素会执行该回调函数。
>> thisArg (可选参数)
>>> 可选参数,执行回调函数 mapFn 时 this 对象。
>> 返回值
>>> 一个新的数组实例
Array.from()
可以通过以下方式来创建数组对象:> 伪数组对象(拥有一个
length
属性和若干索引属性的任意对象)> 可迭代对象(可以获取对象中的元素,如 Map 和 Set 等)
生成一个数字序列
由于数组在每个位置都以
undefined
初始化,下面 v
的值将是 undefined
1 | Array.from({length: 5}, (v, i) => i); // [0, 1, 2, 3, 4] |
compact
从一个数组中移除掉值为false的值。
使用 Array.filter()
过滤掉值为false的值(false
,null
, 0
, undefined
, 和 NaN
)1
const compact = arr => arr.filter(Boolean);
Examples
1 | compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34]); // [ 1, 2, 3, 'a', 's', 34 ] |
countBy
根据给定的函数对数组的元素进行分组,并返回每组中元素的数量。
使用 Array.map()
将数组的值映射到函数或属性名称。 使用 Array.reduce()
创建一个对象,其中的关键字是从映射结果中产生的。1
2
3
4
5const countBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
Examples
1 | countBy([6.1, 4.2, 6.3], Math.floor); // {4: 1, 6: 2} |
countOccurrences
计算数组中值的出现次数。
每次遇到数组中的特定值时,使用 Array.reduce()
来递增计数器。1
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a + 0), 0);
Examples
1 | countOccurrences([1, 1, 2, 1, 2, 3], 1); // 3 |
deepFlatten
深度平整阵列。
使用递归。将 Array.concat()
与空数组([])和展开运算符(…)一起使用以平铺数组。递归地扁平每个元素是一个数组。1
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
Examples
1 | deepFlatten([1, [2], [[3], 4], 5]); // [1,2,3,4,5] |