Осмотреть объект и выполнить модификации на всех соответствующих дочерних узлах - PullRequest
0 голосов
/ 16 октября 2018

Я работаю с большим файлом конфигурации JSON (кстати, с набором запросов API Postman / Newman), и мне нужно выполнить некоторые изменения, прежде чем запускать его в приложении Node.

Пример конфигурации

let config = {
  "name": "API Requests",
  "item": [
    {
      "name": "Upload Data File",
      "body": {
        "formdata": [
          {
            "key": "filerename",
            "value": "./tests/fixtures/data.txt",
            "type": "text"
          }
        ]
      }
    },
    {
      "name": "Another Group",
      "item": [
        {
          "name": "Upload Profile Photo",
          "body": {
            "formdata": [
              {
                "key": "filerename",
                "value": "./tests/fixtures/profilephoto.png",
                "type": "text"
              },
              {
                "key": "anotherkey",
                "value": "1",
                "type": "text"
              }
            ]
          }
        }
      ]
    }
  ]
}

function updateFormdataObjects(config) {
  let updatedConfig;
  // Process the object here and rewrite each of the formdata entries as described below
  return updatedConfig;
}

Необходимые шаги

1) Искать внутри config, чтобы найти всех потомков, которые содержат "key": "filerename"

2) Для каждого соответствующего потомка измените их ключи иследующие значения:

// Original object
{
  "key": "filerename",
  "value": "./tests/fixtures/anotherphoto.png",
  "type": "text"
}

// Updated object
{
  "key": "file",                               // change the value from "filerename" to "file"
  "src": "./tests/fixtures/anotherphoto.png",  // change the key from "value" to "src"
  "type": "file"                               // change the value from "text" to "file"
}

3) После завершения верните весь измененный объект.

Примечания

  • В главном объекте может быть много соответствующих потомков,Все они должны быть обработаны.
  • Объект может иметь бесконечные уровни вложенности, поэтому функция должна учитывать это.
  • Функция должна возвращать один измененный объект, который затем можно использовать в другом месте.
  • Я запускаю этот скрипт как часть Node-приложения с ES6, поэтому могу максимально использовать

1 Ответ

0 голосов
/ 17 октября 2018

Я хотел избежать строкового преобразования JSON и последующего запуска замены Regex на нем, потому что я думал, что это будет менее универсальным в будущем.Но на данный момент это кажется самым простым подходом:

function replaceFilePaths(input) {
    let modified = JSON.stringify(input);
    modified = modifiedCollection.replace(/{\"key\":\"filekey\[(.*?)\]\",\"value\":\"(.*?)\",\"type\":\"text\"}/mg, '{"key":"\$1","src":"\$2","type": "file"}')
    return JSON.parse(modified);
}

Я также внес корректировку, чтобы позволить немного больше настроек для имени ключа, разрешив передать имя ключа, например filekey[file_url], и превратить его в"key": "file_url".

...