Как объединить 2 массива быстрым способом, используя jSONata? - PullRequest
0 голосов
/ 21 марта 2020

Я хотел бы объединить 2 массива, содержащих около 500 элементов, с использованием JSONata.

Я нашел способ объединения 2 массивов, но он не очень производительный. См. https://try.jsonata.org/VqzeZDAjA (тот же ввод и вывод и запрос копируются здесь ниже).

Ввод:

{
  "_msgid": "a070e32c.e71ed",
  "topic": "",
  "rc": {
    "code": 0
  },
  "table1": {
    "array1": [
      {
        "country_region": "Thailand",
        "field_A": "A for Thailand"
      },
      {
        "country_region": "Japan",
        "field_A": "A for Japan"
      }
    ]
  },
  "array2": [
    {
      "country_region": "Thailand",
      "field_B": "B for Thailand"
    },
    {
      "country_region": "Japan",
      "field_B": "B for Japan"
    }
  ]
}

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

{
  "array1": [
    {
      "country_region": "Thailand",
      "field_A": "A for Thailand",
      "field_B": "B for Thailand"
    },
    {
      "country_region": "Japan",
      "field_A": "A for Japan",
      "field_B": "B for Japan"
    }
  ]
}

Рабочий запрос , но не очень эффективный в случае массивов с 500 элементами.

(
    $array2 := array2;
    table1 ~> | array1 | { "field_B" : 
              ($country_region := country_region;
               $array2[$country_region=$.country_region])
                .field_B}|
)

Обновление 2020- 03-29

Здесь выше утверждается, что рабочий запрос (см. Выше) не очень производительный. Дальнейший анализ показал, что это не так: фактическая производительность вышеупомянутого запроса в порядке (аналогична производительности утвержденного запроса). Проблема с производительностью, с которой я столкнулся, была вызвана другим запросом JSONata, который не имеет ничего общего с этим соединением!

1 Ответ

1 голос
/ 23 марта 2020

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

{
    "array1": array2@$A2.table1.array1@$A1[$A1.country_region = $A2.country_region].$merge([$A1, $A2])   
}
...