如何转换数组映射生成指定输出?能否实现无中间变量单行写法?
问题解决思路与代码调整
先看你现有代码的核心问题:你通过两次map得到了转置后的二维数组,但没把它转换成目标的键值对对象。只需要在这个基础上做一步转换,就能得到期望的输出。
基础调整方案
先修正现有代码,快速得到目标结构:
const matches = [ {id: 1, bd: "a"}, {id: 2, bd: "b"}, {id: 4, bd: "e"}, {id: 3, bd: "c"} ]; // 提取id和bd生成二维数组 let matchArgs = matches.map((match) => [match.id, match.bd]); // 转置二维数组得到[[ids集合], [bds集合]] matchArgs = matchArgs[0].map((_, i) => matchArgs.map(row => row[i])); // 包装成目标对象 const result = { ids: matchArgs[0], bds: matchArgs[1] }; console.log(result); // 输出:{ ids: [1,2,4,3], bds: ["a","b","e","c"] }
顺便提一句:你期望输出里的ids: [1,2,4,2]应该是笔误吧?原数组最后一个元素的id是3,所以正确的ids数组应该是[1,2,4,3],上面的代码都是基于原数据生成的正确结果。
无中间变量的单行写法:可行,但需权衡可读性
当然可以实现无中间变量的单行写法,这里提供两种思路:
写法1:用reduce(可读性+性能双优)
这种写法只遍历一次原数组,直接完成数据聚合,没有多余中间变量,是最推荐的方案:
const matches = [ {id: 1, bd: "a"}, {id: 2, bd: "b"}, {id: 4, bd: "e"}, {id: 3, bd: "c"} ]; const result = matches.reduce((acc, { id, bd }) => { acc.ids.push(id); acc.bds.push(bd); return acc; }, { ids: [], bds: [] }); console.log(result);
写法2:极致单行链式写法(简洁但可读性差)
如果追求纯单行的形式,也可以这样写,但这种写法过于紧凑,后续维护成本高,不推荐在团队项目中使用:
const matches = [ {id: 1, bd: "a"}, {id: 2, bd: "b"}, {id: 4, bd: "e"}, {id: 3, bd: "c"} ]; const result = Object.fromEntries([['ids', matches.map(m => m.id)], ['bds', matches.map(m => m.bd)]]); console.log(result);
关于“是否值得用单行写法”的权衡
- 如果是日常业务场景,reduce的写法是最优选择:没有冗余变量,逻辑清晰,性能也更好(只遍历一次原数组,你的原方法需要多次遍历)。
- 极致单行写法虽然能实现,但牺牲了可读性,对于团队协作或后续维护来说,反而会增加理解成本。除非是个人小项目或者非常简单的逻辑,否则不建议为了“炫技”而使用这种写法。
内容的提问来源于stack exchange,提问作者szerte
相关产品推荐
相关产品推荐

