如何将JavaScript对象数组转换为指定键值结构的单个对象?
当然可以实现这个需求!
你之前只得到最后一组键值对,大概率是因为循环过程中每次都重新创建了新对象,而不是在同一个空对象上持续添加属性~ 下面给你两种简单靠谱的实现方法:
方法一:用Array.reduce()(最简洁)
先修正你原数组的语法问题——字符串值需要加引号,不然会报错:
var myarray = [ {"id":1234, "listtext":"open", "prop3":"value3" ,"prop4": "value4"}, {"id":1235, "listtext":"close", "prop3":"value3" ,"prop4": "value4"}, {"id":1236, "listtext":"pending", "prop3":"value3" ,"prop4": "value4"}, {"id":1237, "listtext":"awaiting response", "prop3":"value3" ,"prop4": "value4"} ];
然后用reduce快速转换:
const result = myarray.reduce((acc, item) => { // 把每个元素的id作为键,listtext作为值存入累加器对象 acc[item.id] = item.listtext; return acc; }, {}); // {}是累加器的初始空对象 console.log(result); // 输出:{1234: "open", 1235: "close", 1236: "pending", 1237: "awaiting response"}
reduce的核心是用一个累加器对象(acc),每次循环都往这个对象里添加新的键值对,最后返回完整的对象,不会覆盖之前的内容。
方法二:用Array.forEach()(更直观)
如果你对reduce不太熟悉,用forEach遍历也很容易实现:
var myarray = [/* 数组内容同上 */]; // 先创建一个空对象,用来存最终结果 const result = {}; myarray.forEach(item => { // 给空对象添加键值对:id为键,listtext为值 result[item.id] = item.listtext; }); console.log(result);
这里要注意:一定要把空对象result定义在循环外面!如果把const result = {};写在forEach的回调里,每次循环都会重置对象,最后就只剩最后一个元素的键值对了——这应该就是你之前踩的坑~
额外需求:自定义不同id的状态
如果原数组里的listtext都是open,但你想给不同id设置不同状态(比如你示例里的close、pending等),可以加个判断逻辑:
const result = myarray.reduce((acc, item) => { let status; // 根据id指定对应的状态 switch(item.id) { case 1234: status = "open"; break; case 1235: status = "close"; break; case 1236: status = "pending"; break; case 1237: status = "awaiting response"; break; default: status = item.listtext; // 默认用原数组的listtext } acc[item.id] = status; return acc; }, {});
这样就能完美得到你想要的结构啦!
内容的提问来源于stack exchange,提问作者Ajiboye Adedeji
相关产品推荐
相关产品推荐

