JavaScript中如何构建指定格式对象?现有代码失效求助
解决JavaScript构建邮箱-用户名映射对象的问题
你的代码核心问题出在对象属性名的定义方式上:let selectNewData = {eMail : userName};这一行里,eMail会被当作字面量字符串作为属性名,而不是你定义的变量值,导致每次循环都在覆盖同一个名为"eMail"的键,自然得不到你想要的邮箱-用户名映射结构。
下面是几种修正方案:
方案1:直接赋值(最直观)
跳过Object.assign,直接用方括号语法把变量作为属性名赋值:
$.ajax({ method: "POST", url: "php/somescript.php", data: {"email": "some_email@gmail.com"}, }).done(function( data ) { var result = $.parseJSON(data); // 初始化空对象,不需要{null: null}(除非你确实需要这个键) let select1Data = {}; // 额外判断是否为数组,避免非数组场景报错 if (result!== null && Array.isArray(result)){ for(var i=0; i<result.length; i++){ // 用const/let声明变量,避免全局污染 const userName = result[i].imie + " " + result[i].nazwisko; const eMail = result[i].email; // 方括号语法:把变量值作为属性名 select1Data[eMail] = userName; }; } // 这里可以使用最终的select1Data console.log(select1Data); });
方案2:用计算属性名配合Object.assign
如果坚持用Object.assign,需要用ES6的计算属性名语法,把变量包裹在方括号里:
$.ajax({ method: "POST", url: "php/somescript.php", data: {"email": "some_email@gmail.com"}, }).done(function( data ) { var result = $.parseJSON(data); let select1Data = {}; if (result!== null && Array.isArray(result)){ var len = result.length; for(var i=0; i<len; i++){ const userName = result[i].imie + " " + result[i].nazwisko; const eMail = result[i].email; // 计算属性名:[eMail]会把变量值作为键 let selectNewData = {[eMail] : userName}; Object.assign(select1Data, selectNewData); }; } console.log(select1Data); });
方案3:用Array.reduce简化代码
用数组的reduce方法可以更简洁地把数组转换成目标对象:
$.ajax({ method: "POST", url: "php/somescript.php", data: {"email": "some_email@gmail.com"}, }).done(function( data ) { var result = $.parseJSON(data); let select1Data = {}; if (result!== null && Array.isArray(result)){ select1Data = result.reduce((acc, item) => { const userName = `${item.imie} ${item.nazwisko}`; acc[item.email] = userName; return acc; }, {}); } console.log(select1Data); });
额外注意事项
- 变量
userName和eMail建议用const或let声明,避免成为全局变量 - 如果不需要初始的
null: null键,直接初始化空对象{}即可 - 增加
Array.isArray(result)判断,避免非数组数据导致循环报错
内容的提问来源于stack exchange,提问作者bzc0fq
相关产品推荐
相关产品推荐

