JavaScript如何将字典列表按指定层级组合为嵌套字典
实现方案
核心说明
任意嵌套层级都可以实现,只需传入指定的层级字段列表即可动态适配,不需要修改核心逻辑。
通用实现函数
/** * 动态嵌套合并对象数组 * @param {Array} items 待合并的原始对象数组 * @param {Array} levelFields 嵌套层级的字段列表,按嵌套顺序传入 * @param {String} valueField 最终叶子节点存储的取值字段 * @returns {Object} 嵌套合并后的结果 */ function nestByLevels(items, levelFields, valueField) { const result = {} items.forEach(item => { let currentLevel = result for (let i = 0; i < levelFields.length; i++) { const currentKey = item[levelFields[i]] // 到达最后一层时存储对应值 if (i === levelFields.length - 1) { // 如果相同路径需要累加值,可替换为 currentLevel[currentKey] = (currentLevel[currentKey] || 0) + item[valueField] currentLevel[currentKey] = item[valueField] continue } // 非最后一层不存在则初始化空对象 if (!currentLevel[currentKey]) currentLevel[currentKey] = {} currentLevel = currentLevel[currentKey] } }) return result }
调用示例
// 原始数据整理为数组 const dictList = [ {gender: 'male', age_group: 'young', favourite_band: 'Metallica', number_of_visits: 42}, {gender: 'female', age_group: 'old', favourite_band: 'Beatles', number_of_visits: 2}, {gender: 'male', age_group: 'young', favourite_band: 'Foo Fighters', number_of_visits: 1}, {gender: 'male', age_group: 'old', favourite_band: 'Rolling Stones', number_of_visits: 12} ] // 按需求传入层级字段列表,得到目标结果 const result = nestByLevels(dictList, ['gender', 'age_group', 'favourite_band'], 'number_of_visits')
多层级扩展说明
如果需要新增嵌套层级,只需要调整levelFields参数即可,无需修改函数逻辑。比如要新增province作为第三级嵌套,只需把层级字段列表改为['gender', 'age_group', 'province', 'favourite_band']即可自动适配。
内容的提问来源于stack exchange,提问作者bootica
相关产品推荐
相关产品推荐

