Node.js遍历Azure Artefact响应数组提取指定字段值
遍历Azure Artefact响应数据提取指定字段的解决方法
问题背景
你通过Axios从Azure Artefact feeds获取到如下格式的响应数据,需要提取每个项的normalizedName和对应的normalizedVersion:
{ "value": [ { "normalizedName": "@test", "name": "@test", "versions": [ { "normalizedVersion": "1.2.6", "version": "1.2.6", } ], }, { "normalizedName": "@test2", "name": "@test2", "versions": [ { "normalizedVersion": "4.0.1", "version": "4.0.1", } ], }, { "normalizedName": "@test3", "name": "@test3", "versions": [ { "normalizedVersion": "2.2.0", "version": "2.2.0", } ], }, ] }
期望输出格式:
[ '@test','1.2.6' ] [ '@test2','4.0.1' ] [ '@test3','2.2.0' ]
但你当前的代码仅能提取第一个项的字段值:
for (var key in response.data.value[0]) { if (key === 'normalizedName') { verList.push(response.data.value[0][key]); } } for (var key in response.data.value[0].versions[0]) { if (key === 'normalizedVersion') { verList.push(response.data.value[0].versions[0][key]); } }
当前输出:
[ '@test', '1.2.6' ]
解决思路与代码
你的代码问题在于只操作了response.data.value数组的第一个元素(索引0),没有遍历整个数组。以下是几种可行的实现方式:
方式1:使用map方法(最简洁)
map方法可以直接遍历数组并返回处理后的新数组,非常适合这种场景:
// 提取所有项的normalizedName和对应normalizedVersion const verList = response.data.value.map(item => { // 每个item的versions数组只有一个元素,直接取索引0 return [item.normalizedName, item.versions[0].normalizedVersion]; }); // 按期望格式输出 verList.forEach(item => console.log(item));
方式2:使用forEach遍历
如果更习惯显式的遍历逻辑,可以用forEach:
const verList = []; // 遍历value数组中的每一个包项 response.data.value.forEach(item => { // 提取当前项的目标字段,组成数组存入verList verList.push([item.normalizedName, item.versions[0].normalizedVersion]); }); // 打印结果 verList.forEach(arr => console.log(arr));
方式3:传统for循环
如果你偏好传统的for循环写法:
const verList = []; const items = response.data.value; // 遍历整个value数组 for (let i = 0; i < items.length; i++) { const currentItem = items[i]; verList.push([ currentItem.normalizedName, currentItem.versions[0].normalizedVersion ]); } // 输出结果 for (let i = 0; i < verList.length; i++) { console.log(verList[i]); }
以上三种方式都能遍历所有项,得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者martyzee
相关产品推荐
相关产品推荐

