介绍
array-merge-by-key是一个方便快捷的npm包,用于合并具有相同键的两个数组。该包的操作非常简单,几乎不需要学习成本,而且其高度可定制化的特性,赢得了扩展性与性能方面的平衡。相信这个npm包肯定能够解决你在开发过程中的一些实际问题。
安装
npm i array-merge-by-key
使用方法
const amk = require('array-merge-by-key'); const array1 = [{id: 1, name: '小明'}, {id: 2, name: '小红'}]; const array2 = [{id: 1, age: 18}, {id: 2, age: 19}]; const result = amk(array1, array2, 'id'); console.log(result);
上述代码将array1和array2按'id'合并,最终返回的结果如下:
[ { id: 1, name: '小明', age: 18 }, { id: 2, name: '小红', age: 19 } ]
参数说明
amk(array1, array2, mergeKey, options={})
参数 | 描述 | 类型 | 必需 |
---|---|---|---|
array1 | 需要合并的第一个数组 | Array | 是 |
array2 | 需要合并的第二个数组 | Array | 是 |
mergeKey | 根据哪个键进行合并 | string | 是 |
options.mapper | 匹配器函数,用于通过某个值进行标准化比较。默认值: a => a ,即不做变换和比较。 |
Function | 否 |
options.comparator | 比较器函数,用于比较两个标准化的元素是否相等。默认值: Object.is |
Function | 否 |
options.filler | 'fill'填充函数,用于根据需要填充一个缺失的元素。默认值: () => ({}) ,即返回一个空对象。 |
Function | 否 |
options.rule | merge规则,指定当对象冲突时将如何处理共享键。默认值:'extend',即将新值扩展到旧值上。其他有效值还有 'replace' 和 'accumulate'。 | String | 否 |
定制化合并
在某些情况下,合并的过程需要根据特定需求进行自定义。此时,我们可以使用options参数。
匹配器函数
options.mapper是一个函数,输入的是要进行标准化比较的两个元素,输出的是相应的标准化后的值。以下是一些使用示例:
- 将大小写不敏感的值进行标准化
options.mapper = str => str.toLowerCase();
- 针对日期类型的元素进行标准化
options.mapper = (dateStr, format) => moment(dateStr, format).valueOf(); // 如: moment('2021-12-31', 'YYYY-MM-DD').valueOf() 返回 1640908800000
比较器函数
options.comparator是一个函数,用于比较两个标准化的元素是否相等。默认值是Object.is
。以下是一些使用示例:
- 将大小写不敏感的值进行比较
options.comparator = (a, b) => a.toLowerCase() === b.toLowerCase();
- 针对日期类型的元素进行比较
options.comparator = (a, b) => a <= b; // 小于等于
'fill'填充函数
options.filler是一个 'fill'填充函数,用于根据需要填充一个缺失的元素。默认值是() => ({})
,即返回一个空对象。以下是一些使用示例:
- 加入额外属性
options.filler = () => ({ extra: 'something' });
merge规则
options.rule是merge规则,指定当对象冲突时将如何处理共享键。默认值:'extend',即将新值扩展到旧值上。其他有效值还有 'replace' 和 'accumulate'。以下是一些使用示例:
- 将两个属性值相加
options.rule = 'accumulate'; const array1 = [{ id: 1, value: 1 }, { id: 2, value: 1 }]; const array2 = [{ id: 1, value: 2 }, { id: 2, value: 2 }]; const result = amk(array1, array2, 'id', { mapper: item => item.value, rule: 'accumulate' }); // 输出result: [{ id: 1, value: 3 }, { id: 2, value: 3 }]
总结
通过npm包array-merge-by-key,我们可以非常方便地解决一些在开发中遇到的问题。虽然该包的使用及其简单,但我们可以通过定制化进行进一步的功能拓展,满足不同的需求。因此建议在相对大规模的JS数据合并/转换任务中优先考虑array-merge-by-key。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055b8381e8991b448d9165