使用jQuery合并数组对象,将Ids设为键、Name设为值重构结构
问题解决:将数组对象按键合并为单对象结构
原代码
var IDs = {}; $.ajax({ url: url, type: 'GET', data: { type: "json", requestUrl: "requestUrl", requestWorkflow: "requestWorkflow", directReply: true }, dataType: 'json', success: function( data, textStatus, jQxhr ) { console.log(data); IDs= data; }, error: function(jqXhr, textStatus, errorThrown){ alert( "something went wrong, please try again: " + errorThrown ); }, }); console.log(IDs[0]);
输入数据格式
[0:{Ids: "6",Name: "Michael"}, 1:{Ids: "7",Name: "Gerald"}, 2:{Ids: "8",Name: "Rose"}, 3:{Ids: "9",Name: "Graice"}]
期望输出格式
[0:{"6":"Michael","7":"Gerald","8":"Rose","9":"Graice"}]
解决方案
首先要注意:你写的console.log(IDs[0])会输出undefined,因为AJAX是异步操作,外部的log会在请求完成前执行,处理数据的逻辑必须放在success回调内。
要把数组转换为目标结构,可以用Array.reduce()遍历数组,将每个对象的Ids作为键、Name作为值合并到新对象中,最后把这个对象存入数组即可:
修改后的success回调代码:
success: function( data, textStatus, jQxhr ) { console.log(data); // 合并数组对象为单对象 const mergedObj = data.reduce((acc, item) => { acc[item.Ids] = item.Name; return acc; }, {}); // 封装成期望的数组格式 IDs = [mergedObj]; console.log(IDs[0]); // 此处可正确输出合并后的对象 },
如果你的环境支持ES6+,也可以用更简洁的写法:
const mergedObj = Object.fromEntries(data.map(item => [item.Ids, item.Name])); IDs = [mergedObj];
另外,建议把IDs的初始值改为[],因为最终它是数组类型,语义更准确:
var IDs = [];
内容的提问来源于stack exchange,提问作者santhiran shan
相关产品推荐
相关产品推荐

