Удалить все ключи из вложенного объекта, кроме одного ключа в javascript - PullRequest
0 голосов
/ 19 марта 2020

У меня есть JSON объект следующим образом:

x = {
    "prop1": {
        "description": "prop1",
        "dataType": "string",
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "description": "sub1",
            "dataType": "integer",
            "value" : 12
        },
        "sub2": {
            "description": "sub2",
            "dataType": "integer"
        }
    },
    "prop3": {
        "input": {
            "name": {
                "description": "input messages",
                "dataType": "boolean",
                "value": false
            }
        },
        "output": {
            "description": "output messages",
            "dataType": "boolean",
            "value": false
        }
    }
}

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

y = {
    "prop1": {
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "value" : 12
        }
    },
    "prop3": {
        "input": {
            "name": {
                "value": false
            }
        },
        "output": {
            "value": false
        }
    }
}

Мое текущее решение выглядит следующим образом:

function findValue(obj, string, obj1) {
    if (obj.hasOwnProperty("value")) {
        obj1[string.substring(1)] = obj.value
        return
    }
    for (var key in obj) {
        findValue(obj[key], [string, key].join("."), obj1)
    }
}

console.log(x);
var x1 = {}
findValue(x, "", x1)
var y = {};

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

Object.keys(x1).forEach(key => {
    const keyPath = key.split('.');
    let value = x1[key];
    if (value != null) {
        this.assign(y, keyPath, value);
    }
});

console.log(y);

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

Можно ли как-нибудь улучшить его?

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