NPM 数组模块学习与使用

参考链接:
awesome-micro-npm-packages

NPM 数组模块学习与使用

类型 仓库地址 描述
数组 is-sorted 一个检查数组是否排序的小型模块
数组 array-first 获取数组的第一个元素,可以传递一个长度参数,返回从头部开始指定长度的元素的数组
数组 array-last 获取数组的最后一个元素,可以传递一个长度参数,返回从尾部开始指定长度的元素的数组
数组 arr-flatten 递归扁平化数组。特性:如果元素是数组,递归数组,如果不是数组,则加入到新数组中,最后返回
数组 dedupe 数组去重: 特性:支持字符型、数值型简单数组;数组对象,可传入判断方法执行判断 key
数组 array-range 产生指定范围的密集数组,可用于函数式编程
数组 arr-diff 返回第一个数组的唯一值,比较时使用严格相等。特性:如果第二个参数不是数组,则无效返回原数组。实现:遍历数组,相同元素舍弃,存在多个数组,则循环多次
数组 filled-array 使用指定的元素,生成数组,可以传递一个函数返回特定的元素
数组 map-array 遍历对象数组的元素 key value 加入到数组中
数组 in-array 如果值存在于数组中,返回 true; 比 indexOf 速度更快,前不用担心 null 的问题
数组 unordered-array-remove 有效的移除数组元素,而不进行分割;算法实现元素最后一位出栈,对于元素进行交换,如果是最后的元素,直接返回
数组 mirrarray 通过数组的 value 快速创建 key-value 的对象, 键值重名
数组 group-array 将对象数组分组到列表中

实现细节

+号运算符隐式转换

1
2
+"12"
12

数组赋值

1
2
3
4
5
// 从数组尾部,截取 n 长度,赋值给新数组
var res = new Array(n);
while (n--) {
res[n] = arr[--len];
}

简单递归

1
2
3
4
5
6
7
8
9
10
// 如果元素是数组,递归数组,如果不是数组,则加入到新数组中,最后返回
function flat(arr, res) {
var i = 0, cur;
var len = arr.length;
for (; i < len; i++) {
cur = arr[i];
Array.isArray(cur) ? flat(cur, res) : res.push(cur);
}
return res;
}

传递可选参数(函数)

1
2
3
4
5
6
7
// 判断参数是否是函数
var isFn = typeof item === 'function';

// 判断数组对象是否有 fill 方法, ie不兼容
if (!isFn && typeof ret.fill === 'function') {
return ret.fill(item);
}

判断key是否属于 [‘string’, ‘number’, ‘boolean’, ‘undefined’] 或 null 中的一种

1
2
3
4
5
6
7
/**
* 判断key是否属于 ['string', 'number', 'boolean', 'undefined'] 或 null 中的一种
*/
const isValidKey = element => {
const isNull = element === null;
return ['string', 'number', 'boolean', 'undefined'].includes(typeof element) || isNull;
}

检查同一个 key 中不能有多个 value

实现思路,用对象存储已经保存的 key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const nonOverlappingKey = element => {
/**
* Ensure we don't have distinct elements that coerce to the same key, leading to unexpected results.
* For example, input of [true, 'true'] would return a keymirror of {true: 'true'} despite containing two distinct elements
* if we didn't make this check.
*/
const isNull = element === null;
const typeSeenBefore = keysSeen['' + element];
const thisType = isNull ? 'null' : typeof element;
if (typeSeenBefore) {
return typeSeenBefore === thisType;
} else {
keysSeen['' + element] = thisType;
return true;
}
}