如何从单个数组生成包含数组属性的对象数组:实现名称与关联邮箱分组
解决方案:将名称-邮箱序列数组转换为结构化对象数组
我之前也遇到过类似的数组结构化转换需求,用JavaScript的reduce方法就能很好地解决这个问题,下面是具体的实现思路和代码:
代码实现
// 示例输入数组(可以替换成你的实际数组) const inputArray = ["HR", "someonefks@name.com", "fjkdafaldksjh@name.com", "sfafafads@name.com", "cyber", "fakdjfnakj@name.com", "fdsfasfasds@name.com", "accessibility", "accounting", "dasaasas@name.com", "klhdaflkaa@name.com"]; // 处理数组转换 const parseArrayToStructuredObjects = (arr) => { // 先过滤掉可能存在的空元素(比如数组末尾的多余逗号产生的空值) const cleanedArray = arr.filter(item => typeof item === 'string' && item.trim() !== ''); const { result, currentItem } = cleanedArray.reduce((acc, current) => { // 判断当前元素是名称(不含@)还是邮箱(含@) if (!current.includes('@')) { // 如果已有正在构建的对象,先把它存入结果数组 if (acc.currentItem) { acc.result.push(acc.currentItem); } // 新建一个当前对象,初始化members为空数组 acc.currentItem = { dlName: current, members: [] }; } else { // 邮箱元素直接加入当前对象的members列表 acc.currentItem.members.push(current); } return acc; }, { result: [], currentItem: null }); // 最后把最后一个未存入的对象加入结果 return currentItem ? [...result, currentItem] : result; }; // 执行转换并输出结果 const outputArray = parseArrayToStructuredObjects(inputArray); console.log(outputArray);
逻辑解释
这个方法的核心是用reduce遍历数组时维护两个状态:
result:已经完成结构化的对象数组currentItem:正在收集邮箱的当前名称对象
- 遇到名称元素(不含
@):- 如果之前有正在构建的
currentItem,说明上一个名称的邮箱已经收集完毕,把它加入result - 新建一个
currentItem,设置dlName为当前名称,members初始化为空数组
- 如果之前有正在构建的
- 遇到邮箱元素(含
@):直接将其追加到currentItem的members数组中 - 遍历结束后,把最后一个
currentItem(也就是最后一个名称对应的对象)加入result,避免遗漏
边界情况处理
- 处理了数组末尾可能存在的空元素(比如你给出的原始数组末尾的逗号)
- 兼容了“名称无对应邮箱”的情况(比如示例中的
accessibility,会生成members: []的对象) - 确保即使数组最后一个元素是名称,也能被正确加入结果数组
输出结果(对应示例输入)
运行代码后,会得到你需要的结构化数组:
[ { dlName: "HR", members: ["someonefks@name.com", "fjkdafaldksjh@name.com", "sfafafads@name.com"] }, { dlName: "cyber", members: ["fakdjfnakj@name.com", "fdsfasfasds@name.com"] }, { dlName: "accessibility", members: [] }, { dlName: "accounting", members: ["dasaasas@name.com", "klhdaflkaa@name.com"] } ]
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

