Найти объект json по ключу и заменить его другим объектом из сложного / вложенного массива json - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь найти объект json по свойству / ключу из сложного / вложенного массива json и заменить его другим объектом json в угловом проекте.

Я использовал lodash для поиска объекта json по ключу, но путь объекта json может быть где угодно в массиве json.

Вот мой пример массива json:

{
  "type": "form",
  "title": "title",
  "name": "name",
  "display": "form",
  "path": "path",
  "components": [
    {
      "mask": false,
      "tableView": true,
      "alwaysEnabled": false,
      "label": "",
      "rows": [
        [
          {
            "components": [
              {
                "key": "key1",
                "valueProperty": "value",
                "selectedKey": "ValueKey"
              }
            ]
          }
        ],
        [
          {
            "components": [
              {
                "components": [
                  {
                    "key": "key2",
                    "valueProperty": "value",
                    "selectedKey": "ValueKey"
                  }
                ],
                "allowMultipleMasks": false,
                "showWordCount": false,
                "showCharCount": false,
                "alwaysEnabled": false,
                "type": "textfield",
                "input": true,
                "widget": {
                  "type": ""
                }
              }
            ]
          }
        ],
        [
          {
            "components": [
              {
                "labelPosition": "left-left",
                "allowMultipleMasks": false,
                "showWordCount": false,
                "showCharCount": false,
                "alwaysEnabled": false,
                "input": true,
                "widget": {
                  "type": ""
                }
              }
            ]
          }
        ]
      ],
      "header": [],
      "numCols": 2
    }
  ]
}

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

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

Json object { "key": "key1", "valueProperty": "value", "selectedKey": "ValueKey" } should be replaced with { "key": "key1", "valueProperty": "value", "selectedKey": "ValueKey" } 

Примечание : объект Json может появляться n раз, а путь объекта json может находиться в любом месте массива json.

1 Ответ

1 голос
/ 02 апреля 2019

ОБНОВЛЕНИЕ: Если вы просто хотите проверить, существует ли это свойство, вы можете зачеркнуть объект и выполнить проверку includes, например:

function containsKey(obj, key) {
    return JSON.stringify(obj).includes(key);
}

//OR

function containsKey(obj, key) {
    return JSON.stringify(obj).indexOf(key) !== -1;
}

Вы можете использовать это, чтобы заменить весь объект условным блоком:

if (containsKey(obj, 'selectedKey')) {
    obj = otherObj;
}

ДОПОЛНИТЕЛЬНОЕ РЕШЕНИЕ: Я также адаптировал свое предыдущее решение, которое заменило selectedKey, чтобы просто проверить ключ. Преимущество этого решения заключается в том, что функция вернется сразу после нахождения selectedKey, а не JSON.stringify, который будет перебирать все свойства и значения.

function containsKey(obj, targetKey) {

    // if the obj is an array, iterate it and call containsKey
    if (Array.isArray(obj)) {
        for (let i = 0; i < obj.length; i++) {
            return containsKey(obj[i], targetKey);
        }
    } else {
        // if it's not an array, it will be an obj
        let keys = Object.keys(obj);
        let key, value;

        // iterate the keys of the object
        for (let i = 0; i < keys.length; i++) {
            key = keys[i];
            value = obj[key];

            // if we find the target key, return true
            // otherwise, call containsKey on any objects
            if (key === targetKey) {
                return true;
            } else if (typeof value === 'object') {
                return containsKey(value, targetKey);
            }
        }
    }

    /* by this time we've checked every property of the object,
       so we know it does not contain the property or it would
       have returned true */
    return false;
}
...