Как привести группу объектов в массив? - PullRequest
0 голосов
/ 04 февраля 2020

Существует исходный объект:

var json = {
  results: [
    {
      name: 'Name1',
      volume: 1,
      lists: [
        {
          list: 1,
          tags: ['hello', 'world']
        },
        {
          list: 2,
          tags: ['hello']
        }
      ]
    },
    {
      name: 'Name2',
      volume: 2,
      lists: [
        {
          list: 1,
          tags: ['world']
        },
        {
          list: 2,
          tags: ['hello', 'internet']
        }
      ]
    }
  ]
};

необходимо привести к массиву объектов для всех тегов

var array = [
  {
    volume: 1,
    list: 1,
    tags: 'hello'
  },
  {
    volume: 1,
    list: 1,
    tags: 'world'
  },
  {
    volume: 1,
    list: 2,
    tags: 'hello'
  },
  {
    volume: 2,
    list: 1,
    tags: 'world'
  },
  {
    volume: 2,
    list: 2,
    tags: 'hello'
  },
  {
    volume: 2,
    list: 2,
    tags: 'internet'
  }
];

НО, местоположение в исходном объекте может измениться, поэтому Желательно использовать какую-то библиотеку dot-object , чтобы указать только results.*.lists.*.tags.* И вывести все совпадения в строку.

Я уверен, что необходимая библиотека существует, я не могу найти.

Я не прошу решения, я почти уверен, что уже существует такой пакет npm, который может разбить объект на массив по ключу, просто назовите мне имя.

1 Ответ

0 голосов
/ 04 февраля 2020

Это даст вам желаемый результат без учета вашей проблемы с изменением местоположения

Производительность: O (N ^ 3)

var json = {
  results: [{
      name: 'Name1',
      volume: 1,
      lists: [{
          list: 1,
          tags: ['hello', 'world']
        },
        {
          list: 2,
          tags: ['hello']
        }
      ]
    },
    {
      name: 'Name2',
      volume: 2,
      lists: [{
          list: 1,
          tags: ['world']
        },
        {
          list: 2,
          tags: ['hello', 'internet']
        }
      ]
    }
  ]
};

const result = json.results.reduce((acc1, x) => ([...acc1,
  ...x.lists.reduce((acc2, y) => ([...acc2,
    ...y.tags.reduce((acc3, z) => ([...acc3, {
      volume: x.volume,
      list: y.list,
      tags: z
    }]), [])
  ]), [])
]), [])

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