Проход по бесконечно вложенному объекту и строительная строка - PullRequest
0 голосов
/ 08 февраля 2019

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

Мне трудно разобрать его, например, в реальном примере запросадля этого объекта, выводимого компонентом:

const queryParams = {
  "rules": [
    {
      "rules": [
        {
          "field": "firstName",
          "value": "John",
          "operator": "="
        },
        {
          "field": "lastName",
          "value": "Doe",
          "operator": "="
        }
      ],
      "combinator": "and"
    },
    {
      "rules": [
        {
          "field": "age",
          "value": "20",
          "operator": "="
        },
        {
          "field": "address",
          "value": "London",
          "operator": "="
        }
      ],
      "combinator": "and"
    }
  ],
  "combinator": "and"
}

Мне нужно создать функцию, которая выводила бы более удобный для чтения вывод в виде:

((FirstName = John AND LastName = Doe) AND (AGE = 20 AND Address = London))

Я дал егоКонечно, сложность, которую я нахожу, состоит в следующем:

  • Теоретически объект может быть бесконечно вложенным, я никогда не знаю, насколько он вложен.Это единственный способ сделать это с помощью рекурсии?Или есть более простые способы

  • Правила и группы могут быть в одном и том же объекте

Способ, который я сейчас пытаюсь, не будет работать динамически, поэтому любая помощь или руководство будут с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

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

Работает, проверяя свойство rules:

  • Если данозатем rules отображается с помощью рекурсивного вызова функции.

    Результат этого вызова объединяется со свойством combinator в верхнем регистре и переносится в искомую строку с пробелами в скобках.

  • Если нет, тогда возьмите новыйстрока со свойством field, operator и value.

function combine(object) {
    return 'rules' in object
        ? `(${object.rules.map(combine).join(` ${object.combinator.toUpperCase()} `)})`
        : `${object.field} ${object.operator} ${object.value}`;
}

var data = { rules: [{ rules: [{ field: "firstName", value: "John", operator: "=" }, { field: "lastName", value: "Doe", operator: "=" }], combinator: "and" }, { rules: [{ field: "age", value: "20", operator: "=" }, { field: "address", value: "London", operator: "=" }], combinator: "and" }], combinator: "and" },
    result = combine(data);

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