JavaScript 实现按对象内tags字符串数组对对象数组分组
实现方案
核心逻辑是遍历所有书籍条目,再遍历每条书籍的标签列表,将不含tags字段的书籍信息归入对应标签的分组中,分组不存在时先初始化空数组即可。
原生JS通用实现(无依赖)
const books = [ { name:"abc", isbn: 123, tags: ["tagA","tagB","tagC"] }, { name:"xyz", isbn: 456, tags: ["tagB","tagC"] }, { name:"pqr", isbn: 456, tags: ["tagB"] } ]; function groupByTags(bookList) { const groupResult = {}; for (const book of bookList) { // 分离tags字段,剩余属性就是需要存入分组的书籍信息,和预期输出结构匹配 const { tags, ...bookData } = book; for (const tag of tags) { // 对应标签分组不存在时先初始化为空数组 if (!groupResult[tag]) { groupResult[tag] = []; } groupResult[tag].push(bookData); } } return groupResult; } const expected = groupByTags(books);
函数式写法(基于reduce)
如果偏好函数式编程风格,可以用Array.reduce实现同样逻辑:
const groupByTags = (bookList) => bookList.reduce((result, book) => { const { tags, ...bookData } = book; tags.forEach(tag => { result[tag] = result[tag] ?? []; result[tag].push(bookData); }); return result; }, {});
注意事项
- 上述实现默认和给出的预期输出保持一致,分组内的书籍对象不保留
tags字段,如果需要保留原对象全量字段,去掉解构赋值逻辑,直接push完整book对象即可 - 实现的时间复杂度为O(n*m),n为书籍总数量,m为单本书籍的平均标签数,常规业务数据量下没有性能问题
内容的提问来源于stack exchange,提问作者PKP
相关产品推荐
相关产品推荐

