JavaScript面试题:编写函数按name属性合并数组对象的values值
实现思路
核心是按name字段对数组项分组,合并同分组下的values数组即可,具体步骤如下:
- 用一个Map/普通对象作为临时缓存,key存储
name值,value存储对应该name的已合并values数组 - 遍历原数组所有元素,判断当前元素的
name是否已在缓存中存在:- 存在则将当前元素的
values数组合并入缓存中对应的数组 - 不存在则将当前
name和values存入缓存
- 存在则将当前元素的
- 最后将缓存中的键值对转换为要求的对象数组格式即可
代码实现(JavaScript版本)
简洁版(用Array.reduce实现)
function mergeValues(arr) { const cache = arr.reduce((acc, item) => { acc[item.name] = acc[item.name] ? acc[item.name].concat(item.values) : item.values return acc }, {}) return Object.keys(cache).map(name => ({ name, values: cache[name] })) }
兼容边界情况版(处理非法格式、可选去重等场景)
function mergeValues(arr) { const cache = new Map() for (const item of arr) { // 容错:跳过格式错误的数组项 if (!item?.name || !Array.isArray(item?.values)) continue if (cache.has(item.name)) { // 如果需要对values去重,可替换为以下写法: // cache.set(item.name, [...new Set([...cache.get(item.name), ...item.values])]) cache.set(item.name, cache.get(item.name).concat(item.values)) } else { cache.set(item.name, [...item.values]) } } return Array.from(cache.entries()).map(([name, values]) => ({ name, values })) }
同类题练习渠道
可以多刷各厂前端面试真题里的数据结构转换类题目,这类题目大多来自实际业务中的数据处理场景,平时写业务代码遇到数组、对象格式转换需求的时候,也可以刻意尝试用不同的实现方法优化,积累手感即可。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

