JavaScript:不使用Object.assign将特定数组转为目标格式对象
解决数组转扁平对象的问题
你的问题出在原来的循环只是把数组中的每个对象直接挂载到结果对象的数字键上,没有提取内层对象的键值对合并到目标对象里。咱们来修改一下代码,实现你想要的效果:
方法一:修改原有for循环
var messageArray = [{0:{title:"test1"}},{1:{message1:"message1"}},{2:{message2:"message2"}}]; var rv = {}; for (var i = 0; i < messageArray.length; ++i) { if (messageArray[i] !== undefined) { // 取出当前元素中以索引i为键的内层对象 const innerObj = messageArray[i][i]; // 把内层对象的键值对合并到rv中 Object.assign(rv, innerObj); } } console.log(rv); // 输出:{title: "test1", message1: "message1", message2: "message2"}
这里核心是先用messageArray[i][i]拿到每个元素里的实际内容对象,再用Object.assign把它的属性合并到结果对象rv中。
方法二:用Array.reduce更简洁实现
如果你习惯现代JavaScript写法,reduce方法会更优雅:
const messageArray = [{0:{title:"test1"}},{1:{message1:"message1"}},{2:{message2:"message2"}}]; const rv = messageArray.reduce((result, currentItem, index) => { if (currentItem !== undefined) { // 用扩展运算符合并当前内层对象的属性到结果中 return {...result, ...currentItem[index]}; } return result; }, {}); console.log(rv); // 同样得到目标对象
reduce会遍历数组,每次把当前元素的内层对象属性合并到累加器result里,最终得到你要的扁平对象。
内容的提问来源于stack exchange,提问作者Gajini
相关产品推荐
相关产品推荐

