JavaScript:如何将JSON对象键值对合并到数组同一索引?
解决键值对合并到数组同一索引的问题
嘿,我来帮你搞定这个问题!先看看你原来代码的问题所在:yaxel.push(key) && yaxel.push(obj[key]) 这段代码里,每次循环会先后执行两次push操作——先把键推入数组,再把对应的值推入数组,所以键和值会被分散到数组的两个不同索引里,这就是结果不符合预期的原因。
要让每组键值对处于数组的同一个索引,你只需要把键和值包装成一个整体(数组或对象)再推入数组就行,下面给你两种实用方案:
方案1:修改原有循环代码
如果你想保留自己写循环的逻辑,只需要调整push的内容,把键和值包装成一个数组再推入:
Object.y = function (obj) { var yaxel = []; var key; for (key in obj) { if (obj.hasOwnProperty(key)) { // 将键和值包装为一个数组后推入 yaxel.push([key, obj[key]]); } } return yaxel; }; var y = Object.y(jsonData["currencies"]); console.log(y);
执行后你会得到符合预期的结果:
[ ["AED", "United Arab Emirates Dirham"], ["ALL", "Albanian Lek"], ["AMD", "Armenian Dram"], ["ANG", "Netherlands Antillean Guilder"], ["ARS", "Argentine Peso"], ["AUD", "Australian Dollar"] ]
方案2:使用ES6原生方法(更简洁)
如果你项目支持ES6及以上语法,直接用原生的Object.entries()方法就能一步到位,它会自动把对象的键值对转换成你想要的数组格式:
var y = Object.entries(jsonData["currencies"]); console.log(y);
这个方法的输出和方案1完全一致,而且不需要自己写循环,代码更简洁易读。
如果你的需求是每个索引里是一个结构化对象(比如{code: "AED", name: "United Arab Emirates Dirham"}),也可以轻松调整:
// 方案1修改版 yaxel.push({ code: key, name: obj[key] }); // Object.entries配合map实现 var y = Object.entries(jsonData["currencies"]).map(([code, name]) => ({ code, name }));
内容的提问来源于stack exchange,提问作者RezaAhmadi
相关产品推荐
相关产品推荐

