Как динамически создать объект без изменения иерархии путем фильтрации и изменения другого объекта? - PullRequest
0 голосов
/ 05 сентября 2018

Для создания вложенного объекта мы можем сделать, как показано ниже

function assign(obj, keyPath, value) {
   lastKeyIndex = keyPath.length-1;
   for (var i = 0; i < lastKeyIndex; ++ i) {
     key = keyPath[i];
     if (!(key in obj))
       obj[key] = {}
     obj = obj[key];
   }
   obj[keyPath[lastKeyIndex]] = value;
}

Usage:

var settings = {};
assign(settings, ['Modules', 'Video', 'Plugin'], 'JWPlayer');

, что приведет к этому

"{"Modules":{"Video":{"Plugin":"JWPlayer"}}}"

Я хотел создать вложенный объект, у которого будет несколько дочерних элементов также на одном уровне.

У меня есть следующие данные

{
    "children": [{
        "children": [{
            "children": [],
            "label": "A",
            "OrganizationId": 152,
            "id": 152
        }, {
            "children": [{
                "children": [{
                    "children": [],
                    "label": "B",
                    "OrganizationId": 180,
                    "id": 180
                }, {
                    "children": [],
                    "label": "C",
                    "OrganizationId": 181,
                    "id": 181
                }],
                "label": "D",
                "OrganizationId": 166,
                "id": 166
            }],
            "label": "E",
            "OrganizationId": 154,
            "id": 154

        }, {
            "children": [],
            "label": "F",
            "OrganizationId": 157,
            "id": 157
        }, {
            "children": [{
                "children": [{
                    "children": [],
                    "label": "G ",
                    "OrganizationId": 182,
                    "id": 182
                }],
                "label": "H",
                "OrganizationId": 167,
                "id": 167
            }],
            "label": "I",
            "OrganizationId": 155,
            "id": 155

        }]
    }]
}

Так что я должен изменить вышеуказанный объект

т.е. выбрать только значение метки и назначить его в качестве ключа в новом объекте поддерживая ту же иерархию (ожидаемый результат - ниже)

Ожидаемый результат:

{
    "A": "",
    "E": {
        "D": {
            "B": "",
            "C": ""
        }
    },
    "F": "",
    "I": {
        "H": {
            "G": ""
        }
    }
}

было бы очень полезно, если бы кто-то мог дать подсказку или решение для реализации этого. Был бы очень признателен!

Пожалуйста, прежде чем подавать отрицательные голоса, скажите, что нужно отредактировать или что не так с этим вопросом.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Другой способ:

function getNestedProperties(oldObj, newObj, property) {
  if (oldObj && typeof oldObj === "object") {
    let next = null;
    if (property in oldObj) {
      next = newObj[oldObj[property]] = {};
    }
    for (const key of Object.keys(oldObj)) {
      getNestedProperties(oldObj[key], next ? next : newObj, property);
    }
  }
}

const oldObject = {
  children: [
    {
      children: [
        {
          children: [],
          label: "A",
          OrganizationId: 152,
          id: 152
        },
        {
          children: [
            {
              children: [
                {
                  children: [],
                  label: "B",
                  OrganizationId: 180,
                  id: 180
                },
                {
                  children: [],
                  label: "C",
                  OrganizationId: 181,
                  id: 181
                }
              ],
              label: "D",
              OrganizationId: 166,
              id: 166
            }
          ],
          label: "E",
          OrganizationId: 154,
          id: 154
        },
        {
          children: [],
          label: "F",
          OrganizationId: 157,
          id: 157
        },
        {
          children: [
            {
              children: [
                {
                  children: [],
                  label: "G ",
                  OrganizationId: 182,
                  id: 182
                }
              ],
              label: "H",
              OrganizationId: 167,
              id: 167
            }
          ],
          label: "I",
          OrganizationId: 155,
          id: 155
        }
      ]
    }
  ]
};

function getNestedProperties(oldObj, newObj, property) {
  if (oldObj && typeof oldObj === "object") {
    let next = null;
    if (property in oldObj) {
      next = newObj[oldObj[property]] = {};
    }
    for (const key of Object.keys(oldObj)) {
      getNestedProperties(oldObj[key], next ? next : newObj, property);
    }
  }
}

let newObject = {};
getNestedProperties(oldObject, newObject, "label");

console.log(newObject);
0 голосов
/ 05 сентября 2018

Вы можете использовать следующий код для обработки:

function getNestedLabels(objectToProcess) {
  var obj = {};

  if (Array.isArray(objectToProcess.children) && objectToProcess.children.length > 0) {
    return objectToProcess.children.reduce(function(o, child) {
      o[child.label] = getNestedLabels(child);
      return o;
    }, obj)
  } else {
    return '';
  }
}

function getNestedLabels(objectToProcess) {
  var obj = {};

  if (Array.isArray(objectToProcess.children) && objectToProcess.children.length > 0) {
    return objectToProcess.children.reduce(function(o, child) {
      o[child.label] = getNestedLabels(child);
      return o;
    }, obj)
  } else {
    return '';
  }
}

var d = {
  "children": [{
    "children": [{
      "children": [],
      "label": "A",
      "OrganizationId": 152,
      "id": 152
    }, {
      "children": [{
        "children": [{
          "children": [],
          "label": "B",
          "OrganizationId": 180,
          "id": 180
        }, {
          "children": [],
          "label": "C",
          "OrganizationId": 181,
          "id": 181
        }],
        "label": "D",
        "OrganizationId": 166,
        "id": 166
      }],
      "label": "E",
      "OrganizationId": 154,
      "id": 154

    }, {
      "children": [],
      "label": "F",
      "OrganizationId": 157,
      "id": 157
    }, {
      "children": [{
        "children": [{
          "children": [],
          "label": "G ",
          "OrganizationId": 182,
          "id": 182
        }],
        "label": "H",
        "OrganizationId": 167,
        "id": 167
      }],
      "label": "I",
      "OrganizationId": 155,
      "id": 155

    }]
  }]
};

console.log(getNestedLabels(d))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...