javascript - 使用递归,检索嵌套对象结构的对象名称返回未定义
问题描述
我正在尝试检索嵌套对象树/结构中的所有对象名称。
var testObj = {
"name": "testObj",
"version": "0.1.1",
"dependencies": {
"nameLvl1-1": {
"version": "0.3.7",
"dependencies": {
"nameLvl2": {
"version": "0.0.2"
}
}
},
"nameLvl1-2": {
"version": "1.2.6"
}
}
}
目前我正在使用递归遍历结构,但是当我尝试“捕获”嵌套结构中的对象名称时,它返回“未定义”
这是我目前拥有的:
const versionKeys2 = (obj) => {
const result = []
Object.keys(obj).forEach(x => {
const key = x;
const value = obj[x];
if (key === 'version') {
console.log(`${key} as key, ${obj[key]} as value, ${obj.name} as obj`)
result.push(`${obj.name}@${obj[key]}`)
}
if (typeof value === 'object') {
result.push(versionKeys2(value))
}
})
return result
}
作为记录到控制台的示例:
version as key, 0.3.7 as value, undefined as obj
对于第一级,它返回名称,但在该级别之后,“${obj.name}”返回未定义的嵌套对象。任何人都知道解决第一级以外的对象名称吗?
编辑:基于模板文字字符串的预期结果看起来像这样——[["dependencies"@"0.3.7"],["nameLvl1-1"@"0.3.7"],["nameLvl2"@"0.0.2"],["nameLvl1-2"@"1.2.6"]]
解决方案
您可以获取嵌套名称并检查实际对象是否包含name
属性。
const
getNames = (object, name) => [
`${object.name || name}@${object.version}`,
...Object
.entries(object.dependencies || {})
.flatMap(([k, v]) => getNames(v, k))
],
testObj = { name: "testObj", version: "0.1.1", dependencies: { "nameLvl1-1": { version: "0.3.7", dependencies: { nameLvl2: { version: "0.0.2" } } }, "nameLvl1-2": { version: "1.2.6" } } },
names = getNames(testObj);
console.log(names);
推荐阅读
- javascript - 如何在不减慢网页速度的情况下减慢自定义 Javascript 扩展程序的速度?
- xamarin.forms - FrameRenderer 避免了 Android 上的 Frame.GestureRecognizers 命令
- discord.js - 如何使嵌入消息稍后编辑
- tsql - 需要在 T-SQL 代码中填充预算余额(BudgetRemaining 值)
- java - JpaRepository findAll 返回空列表
- conda - 将 conda 更新到开发版本
- javascript - 使用带有 Google 表格 API 的 Jquery AJAX put 方法会出现错误 401
- php - 如何计算特定数组值并分配表数据中的值
- scala - 无法让 SBT 从 Artifactory Pro 公司代理后面下载自己
- python - lxml 给我返回了一个列表,但它是空的