我正在嘗試迭代一個看起來像這樣的 JSON 物件結構。
{
"id": 1,
"recursoId": {
"id": 1,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Producción (Retama)",
"nombre": "Retama",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "120",
"port": "1234",
"parent": null,
"children": [
{
"id": 2,
"recursoId": {
"id": 2,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Preproducción (Faya)",
"nombre": "Faya",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "101",
"port": "101",
"parent": null,
"children": [
{
"id": 4,
"recursoId": {
"id": 4,
"tipoRecurso": {
"id": 3,
"nombre": "Servidor aplicaciones Tomcat",
"icono": "fas fa-database"
},
"alias": "Servidor Producción (Tacoronte2)",
"nombre": "Tacoronte2",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "103",
"port": "103",
"parent": null,
"children": [
{
"id": 8,
"recursoId": {
"id": 8,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Inicio",
"nombre": "Inicio",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "107",
"port": "107",
"parent": null,
"children": []
},
{
"id": 9,
"recursoId": {
"id": 8,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Inicio",
"nombre": "Inicio",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "108",
"port": "108",
"parent": null,
"children": []
}
]
},
{
"id": 5,
"recursoId": {
"id": 5,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Preproducción (Faya)",
"nombre": "Tejina",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": true
},
"ip": "104",
"port": "104",
"parent": null,
"children": []
}
]
},
{
"id": 3,
"recursoId": {
"id": 3,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Desarrollo (Tabaiba)",
"nombre": "Tabaiba",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "102",
"port": "102",
"parent": null,
"children": [
{
"id": 6,
"recursoId": {
"id": 6,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Buzón",
"nombre": "Buzon",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": false
},
"ip": "105",
"port": "105",
"parent": null,
"children": []
},
{
"id": 7,
"recursoId": {
"id": 7,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Estadísticas",
"nombre": "Estadisticas",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "106",
"port": "106",
"parent": null,
"children": []
}
]
}
]
}
所以這是一個樹狀的子父關系。每個節點都有一個唯一的 ID。我正在嘗試使用遞回函式遍歷整個物件,但我對孩子們有一些問題。
這是我的代碼,其中“instancias”是完整的物件
jsonAdapter(instancias: any) {
Object.entries(instancias).forEach((entry) => {
const [key, value] = entry;
if (key === 'recursoId') {
Object.entries(value).forEach((recursoIdEntry) => {
const [key, value] = recursoIdEntry;
if (key === 'tipoRecurso') {
Object.entries(value).forEach((tipoRecursoEntry) => {
const [key, value] = tipoRecursoEntry;
})
}
if (key === 'propietario') {
Object.entries(value).forEach((propietarioEntry) => {
const [key, value] = propietarioEntry;
})
}
})
}
if ((key === 'children') && value) {
for (let i = 0; i < entry.length; i ) {
this.jsonAdapter(value[i]);
}
}
});
}
我執行我的代碼并正確回傳樹的第一個分支。但在那之后函式總是回傳 undefined (總是進入 if )。我不知道如何解決這個問題。謝謝!。
uj5u.com熱心網友回復:
這個函式“離開”遞回地迭代葉鍵/值,傳遞包含物件的背景關系。舉個例子,呼叫者使用它將所有的“nombre”道具重命名為“renamed_nombre”。
function leaves(obj, callback) {
for (let property in obj) {
if (obj.hasOwnProperty(property) && obj[property] != null) {
if (typeof obj[property] === 'object') {
leaves(obj[property], callback);
} else if (typeof obj[property] === 'array') {
for (let i = 0; i < obj[property].length; i ) {
leaves(obj[property][i], callback);
}
} else {
callback(obj, property, obj[property])
}
}
}
}
let bigObject = getBigObject()
leaves(bigObject, (object, key, value) => {
if (key === 'nombre') {
object.renamed_nombre = value
delete object[key]
}
})
console.log(JSON.stringify(bigObject, null, 4))
function getBigObject() {
return {
"id": 1,
"recursoId": {
"id": 1,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Producción (Retama)",
"nombre": "Retama",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "120",
"port": "1234",
"parent": null,
"children": [{
"id": 2,
"recursoId": {
"id": 2,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Preproducción (Faya)",
"nombre": "Faya",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "101",
"port": "101",
"parent": null,
"children": [{
"id": 4,
"recursoId": {
"id": 4,
"tipoRecurso": {
"id": 3,
"nombre": "Servidor aplicaciones Tomcat",
"icono": "fas fa-database"
},
"alias": "Servidor Producción (Tacoronte2)",
"nombre": "Tacoronte2",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "103",
"port": "103",
"parent": null,
"children": [{
"id": 8,
"recursoId": {
"id": 8,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Inicio",
"nombre": "Inicio",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "107",
"port": "107",
"parent": null,
"children": []
},
{
"id": 9,
"recursoId": {
"id": 8,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Inicio",
"nombre": "Inicio",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "108",
"port": "108",
"parent": null,
"children": []
}
]
},
{
"id": 5,
"recursoId": {
"id": 5,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Preproducción (Faya)",
"nombre": "Tejina",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": true
},
"ip": "104",
"port": "104",
"parent": null,
"children": []
}
]
},
{
"id": 3,
"recursoId": {
"id": 3,
"tipoRecurso": {
"id": 5,
"nombre": "Base de datos PostgreSQL",
"icono": "fas fa-database"
},
"alias": "Base de datos Desarrollo (Tabaiba)",
"nombre": "Tabaiba",
"propietario": {
"id": 4,
"nombre": "Sistemas"
},
"servicio012": false
},
"ip": "102",
"port": "102",
"parent": null,
"children": [{
"id": 6,
"recursoId": {
"id": 6,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Buzón",
"nombre": "Buzon",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": false
},
"ip": "105",
"port": "105",
"parent": null,
"children": []
},
{
"id": 7,
"recursoId": {
"id": 7,
"tipoRecurso": {
"id": 1,
"nombre": "Aplicación",
"icono": "fas fa-terminal"
},
"alias": "Estadísticas",
"nombre": "Estadisticas",
"propietario": {
"id": 1,
"nombre": "Formación"
},
"servicio012": true
},
"ip": "106",
"port": "106",
"parent": null,
"children": []
}
]
}
]
}
}
uj5u.com熱心網友回復:
那么你遇到的問題是在最后一個if陳述句中,你有一個回圈使用entry.length它總是回傳 2因為每個條目都有一個鍵和值對。即使 children 為空,條目也等于["children", []]并且其長度為 2。您應該使用 value.length 代替,如下所示:
if ((key === 'children') && value) {
for (let i = 0; i < value.length; i ) {
this.jsonAdapter(value[i]);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/371672.html
標籤:javascript json 打字稿 递归
