Как получить абсолютный путь от объекта с помощью рекурсивной функции?

#javascript #jquery

Вопрос:

Я преобразую объект в формат узла дерева, используя приведенный ниже метод

 function getNodes(object) {
  return Object
    .entries(object)
    .map(([key, value]) => value amp;amp; typeof value === 'object' ?
      {
        value: key   value,
        label: key,
        children: getNodes(value)
      } :
      {
        value: key   value,
        label: key
      }
    );
}
 

Образцом объекта является:

 var object = {
  "income-array": [{
    "income": {
      "id": "1234",
      "currency": "dollar",
      "details": {
        "individual-income": [{
          "name": "abcd",
          "income": 100
        }, {
          "name": "xyz",
          "income": 500
        }]
      }
    }
  }]
}
 

Я получаю этот результат:

 [{
  "value": "income-array[object Object]",
  "label": "income-array",
  "children": [{
    "value": "0[object Object]",
    "label": "0",
    "children": [{
      "value": "income[object Object]",
      "label": "income",
      "children": [{
        "value": "id1234",
        "label": "id"
      }, {
        "value": "currencydollar",
        "label": "currency"
      }, {
        "value": "details[object Object]",
        "label": "details",
        "children": [{
          "value": "individual-income[object Object],[object Object]",
          "label": "individual-income",
          "children": [{
            "value": "0[object Object]",
            "label": "0",
            "children": [{
              "value": "nameabcd",
              "label": "name"
            }, {
              "value": "income100",
              "label": "income"
            }]
          }, {
            "value": "1[object Object]",
            "label": "1",
            "children": [{
              "value": "namexyz",
              "label": "name"
            }, {
              "value": "income500",
              "label": "income"
            }]
          }]
        }]
      }]
    }]
  }]
}]
 

Я хочу получить путь к свойству value от корня до определенного узла, как показано ниже. Я запутался в том, как добавить пошаговый путь к значению.

 [{
  "value": "income-array",
  "label": "income-array",
  "children": [{
    "value": "['income-array'][0]",
    "label": "0",
    "children": [{
      "value": "['income-array'][0]['income']",
      "label": "income",
      "children": [{
        "value": "['income-array'][0]['income']['id']",
        "label": "id"
      }, {
        "value": "['income-array'][0]['income']['currencydollar']",
        "label": "currency"
      }, {
        "value": "['income-array'][0]['income']['details']",
        "label": "details",
        "children": [{
          "value": "['income-array'][0]['income']['details']['individual-income']",
          "label": "individual-income",
          "children": [{
            "value": "['income-array'][0]['income']['details']['individual-income'][0]",
            "label": "0",
            "children": [{
              "value": "['income-array'][0]['income']['details']['individual-income'][0]['name']",
              "label": "name"
            }, {
              "value": "['income-array'][0]['income']['details']['individual-income'][0]['income']",
              "label": "income"
            }]
          }, {
            "value": "['income-array'][0]['income']['details']['individual-income'][1]",
            "label": "1",
            "children": [{
              "value": "['income-array'][0]['income']['details']['individual-income'][1]['name']",
              "label": "name"
            }, {
              "value": "['income-array'][0]['income']['details']['individual-income'][1]['income']",
              "label": "income"
            }]
          }]
        }]
      }]
    }]
  }]
}]
 

Не могли бы вы, пожалуйста, подсказать мне, как это решить? Спасибо

Комментарии:

1. Зачем вы это делаете value: key value , когда ценность-это объект? Вот почему вы получаете "income-array[object Object]"

Ответ №1:

Внешняя функция должна передать свой собственный текущий абсолютный путь (который value указан в вашем коде) внутренней функции, чтобы внутренняя функция знала предыдущие пути.

Обратите внимание на parentPath='' параметр и children: getNodes(value, currentPath) ниже

 function getNodes(object, parentPath = "") {
  return Object.entries(object).map(([key, value]) => {
    const currentPath = parentPath   `[${key}]`;
    return value amp;amp; typeof value === "object"
      ? {
          value: currentPath,
          label: key,
          children: getNodes(value, currentPath),
        }
      : {
          value: currentPath,
          label: key,
        };
  });
}
 

После этого запустите getNodes(object) в браузере, и вы получите такой результат.

 [
  {
    "value": "[income-array]",
    "label": "income-array",
    "children": [
      {
        "value": "[income-array][0]",
        "label": "0",
        "children": [
          {
            "value": "[income-array][0][income]",
            "label": "income",
            "children": [
              {
                "value": "[income-array][0][income][id]",
                "label": "id"
              },
              {
                "value": "[income-array][0][income][currency]",
                "label": "currency"
              },
              {
                "value": "[income-array][0][income][details]",
                "label": "details",
                "children": [
                  {
                    "value": "[income-array][0][income][details][individual-income]",
                    "label": "individual-income",
                    "children": [
                      {
                        "value": "[income-array][0][income][details][individual-income][0]",
                        "label": "0",
                        "children": [
                          {
                            "value": "[income-array][0][income][details][individual-income][0][name]",
                            "label": "name"
                          },
                          {
                            "value": "[income-array][0][income][details][individual-income][0][income]",
                            "label": "income"
                          }
                        ]
                      },
                      {
                        "value": "[income-array][0][income][details][individual-income][1]",
                        "label": "1",
                        "children": [
                          {
                            "value": "[income-array][0][income][details][individual-income][1][name]",
                            "label": "name"
                          },
                          {
                            "value": "[income-array][0][income][details][individual-income][1][income]",
                            "label": "income"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]