如何将JSON数组转为指定键值对对象?JS报错求助
问题:将数组转换为指定键值对对象
原始对象:
const order = { requests: [ { code: 'T1', id: '123', requestStatus: 'request' }, { code: 'T2', id: '321', requestStatus: 'request' } ] };
期望得到的结构:
const ids = { '123': 'T1', '321': 'T2' };
尝试的代码及报错:
let id = order['requests'].map((r) => [r.code] = r.id); console.log(ids['123'] == 'T1'); console.log(ids['321'] == 'T2');
报错信息:object null is not iterable (cannot read property Symbol(Symbol.iterator))
错误原因
- 变量名不匹配:声明的变量是
id,但后续调用的是ids,导致ids未定义。 map方法用法错误:map返回数组,而你需要的是对象;另外[r.code] = r.id的解构写法不成立——r.id是字符串,无法解构到数组中,这才触发了迭代器相关报错。
正确实现方式
要把数组转换为指定结构的对象,用reduce方法最直接:
const order = { requests: [ { code: 'T1', id: '123', requestStatus: 'request' }, { code: 'T2', id: '321', requestStatus: 'request' } ] }; // 用reduce遍历数组,逐步构建目标对象 const ids = order.requests.reduce((acc, item) => { acc[item.id] = item.code; return acc; }, {}); // 初始值为空对象 console.log(ids['123'] === 'T1'); // true console.log(ids['321'] === 'T2'); // true
代码解释
reduce接收两个参数:回调函数和初始值(这里是空对象{})。- 回调函数中的
acc是累计构建的对象,每次遍历把当前item的id作为键、code作为值添加到acc中,最后返回acc。 - 遍历完成后,
acc就是你需要的ids对象。
内容的提问来源于stack exchange,提问作者user826323
相关产品推荐
相关产品推荐

