JavaScript如何读取JSON指定键值 处理AWS Textract输出遍历问题
问题描述
我从AWS Textract获取了一系列对象,想要基于其生成JSON,数据结构如下:
'2': { '1': 'Total revenues ', '2': '1,243 ', '3': '1,283 ', '4': '1,137 ', '5': '1,351 ', '6': '1,926 ' }, '3': { '1': 'Personnel costs ', '2': '-724 ', '3': '-711 ', '4': '-633 ', '5': '-730 ', '6': '-994 ' }, '4': { '1': 'Non-personell costs ', '2': '-252 ', '3': '-262 ', '4': '-273 ', '5': '-282 ', '6': '-297 ' }, '5': { '1': 'Total operating costs ', '2': '-976 ', '3': '-972 ', '4': '-905 ', '5': '-1,012 ', '6': '-1,291 ' }
我已经移除了最外层键'1'仅保留数字键,由于每个键代表一个年份,我想要第一次迭代从键'2'开始,之后依次遍历键'3'及后续键,请问该如何实现?
我当前编写的代码如下:
for (const data in test) { if (Object.values(test[data]['1']).length != 0) { let column = test[data]['1'].replace(/\s+$/, '') headers.push({ [column]: 1 }) delete test[data]['1']; let array = ['2','3','4','5','6'] array.forEach(x => { console.log(data, test[data][x]) }) }
我多次尝试后都出现了相同问题:程序会先遍历1到6的所有键,之后才跳转到下一个对象进行遍历。
解决方法
你遇到的遍历顺序问题是for...in的特性导致的:当遍历对象的键为数字字符串时,for...in会默认按照数字升序排列,不会按照你预期的自定义顺序执行。直接手动指定外层遍历的键顺序即可解决问题,参考代码如下:
const headers = [] const finalJson = {} // 手动指定外层对象的遍历顺序,从2开始依次执行 const outerOrder = ['2', '3', '4', '5'] outerOrder.forEach(rowKey => { const currentRow = test[rowKey] // 提取行名称 const rowName = currentRow['1'].trimEnd() headers.push({ [rowName]: 1 }) // 按顺序读取各年份对应值 const yearData = {} const yearOrder = ['2','3','4','5','6'] yearOrder.forEach(yearKey => { yearData[`year_${yearKey}`] = currentRow[yearKey].trim() console.log(rowKey, currentRow[yearKey].trim()) }) finalJson[rowName] = yearData }) // 需要生成JSON时直接调用即可 // console.log(JSON.stringify(finalJson))
补充说明
- 不要用
for...in处理有数字键、且要求严格遍历顺序的场景,手动指定遍历键数组是最稳妥的方案 - 不需要删除原对象的
'1'键,直接读取使用即可,避免修改原始数据引发其他逻辑问题 - 用
trimEnd()替代正则replace(/\s+$/, ''),性能和可读性都更好
内容的提问来源于stack exchange,提问作者vall370
相关产品推荐
相关产品推荐

