Слияние строк, находящихся в массиве json, на основе определенных ключей - PullRequest
0 голосов
/ 18 февраля 2019

В поисках решения проблемы:

Необходимо объединить следующий массив, чтобы в окончательном выводе была только одна строка, соответствующая каждой уникальной комбинации категории и подкатегории, остальные поля (тема и личная информация)), объединены в один массив:

Ввод:

[
   {
      "category":"cat2",
      "subcategory":"b",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic3"
      ]
   },
   {
      "category":"cat1",
      "subcategory":"a",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic4"
      ]
   },
   {
      "category":"cat2",
      "subcategory":"b",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic5",
         "topic2"
      ]
   },
   {
      "category":"cat2",
      "subcategory":"b",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat2",
      "subcategory":"b",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat1",
      "subcategory":"a",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat1",
      "subcategory":"a",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat3",
      "subcategory":"c",
      "personal":[
         "inclsn3"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat1",
      "subcategory":"a",
      "personal":[
         "inclsn2"
      ],
      "topic":[
         "topic1",
         "topic2"
      ]
   },
   {
      "category":"cat1",
      "subcategory":"a",
      "personal":null,
      "topic":[
         "topic6"
      ]
   }
]

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

[{"category": "cat2", "subcategory": "b", "personal": ["inclsn2"], "topic": ["topic2","topic5","topic4","topic1"]},
{"category": "cat1", "subcategory": "a", "personal": ["inclsn2"], "topic": ["topic6","topic2","topic4","topic1"]},
{"category": "cat3", "subcategory": "c", "personal": ["inclsn3"], "topic": ["topic1","topic2"]}]

Любая помощь по этому вопросу будет принята с благодарностью.

Спасибо

1 Ответ

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

Одним из решений вашей проблемы будет фильтрация массива с условием не видеть комбинацию категории / подкатегории раньше.Вы можете использовать объект, ключи которого будут представлять собой некоторую комбинацию категории / подкатегории (например, объединенную с некоторым разделителем) и посмотреть, имеет ли этот объект заданный ключ.

Вы можете сделать это с помощью чего-то подобного:

const input = [] // your array here

const d = '\t';
const merge = (a, c = {}) => a.filter((e, f, k) =>
              (k = e.category + d + e.subcategory, f = c[k], c[k] = 1, !f));

console.log(merge(input));

Убедитесь, что для d задана какая-то строка, которая никогда не будет частью реальной категории или имени подкатегории - здесь это символ табуляции, но вы можете установить его на что-нибудь еще.

Вывод для вашего массива:

[ { category: 'cat2',
    subcategory: 'b',
    personal: [ 'inclsn2' ],
    topic: [ 'topic1', 'topic3' ] },
  { category: 'cat1',
    subcategory: 'a',
    personal: [ 'inclsn2' ],
    topic: [ 'topic4' ] },
  { category: 'cat3',
    subcategory: 'c',
    personal: [ 'inclsn3' ],
    topic: [ 'topic1', 'topic2' ] } ]

Если вы используете Lodash, вы можете еще больше упростить вашу merge() функцию:

const _ = require('lodash');

const d = '\t';
const merge = a => _.uniqBy(a, e => e.category + d + e.subcategory);

console.log(merge(input));
...