Преобразование массива объектов - некоторые операции с массивами и объектами - PullRequest
0 голосов
/ 23 сентября 2018

Массив данных

[
 {group: 'a', tab: "1", name: 'input1'},
 {group: 'b', tab: "1", name: 'input2'},
 {group: 'b', tab: "1", name: 'input3'},
 {group: 'c', tab: "2", name: 'input4'},
 {group: 'a', tab: "1", name: 'input5'},
 {group: 'c', tab: "2", name: 'input6'},
];

Каждый элемент массива (их более 50) - это один вход, который принадлежит одной группе (a, b или c) и табуляции (1, 2 и т. Д.) В моем приложении.Я хочу проверить, сколько групп имеет одна вкладка, получить объект или массив, который выглядит следующим образом:

 [
      {tab1:{groups: ["a", "b"]}},
      {tab2:{groups: ["c"]}},
    ]

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

Мы можем использовать Установить для создания уникального массива и использовать map для управления каждым элементом массива и filter для удаления элементов из массива.Итак, я сделал следующее:

  1. Получите уникальный список вкладок.
  2. Сопоставьте список для создания нового объекта для каждой вкладки
    1. Используйте фильтр длячтобы найти вкладки определенного типа
    2. Сопоставьте этот фильтр, чтобы получить только букву группы
    3. Снова создайте набор для уникального списка групповых букв.
  3. Наконец, новый объект возвращается обратно к первому элементу карты, чтобы получить массив элементов.

Это выглядит так:

let data = [
 {group: 'a', tab: "1", name: 'input1'},
 {group: 'b', tab: "1", name: 'input2'},
 {group: 'b', tab: "1", name: 'input3'},
 {group: 'c', tab: "2", name: 'input4'},
 {group: 'a', tab: "1", name: 'input5'},
 {group: 'c', tab: "2", name: 'input6'},
];

let tabs = [...new Set(data.map(itm => itm.tab))].map(tab => {
  return {
    ['tab' + tab]: {groups: [...new Set(data.filter(i => i.tab == tab).map(i => i.group))]}
  }
})

console.log(tabs)
0 голосов
/ 23 сентября 2018

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

var data = [{ group: 'a', tab: '1', name: 'input1' }, { group: 'b', tab: '1', name: 'input2' }, { group: 'b', tab: '1', name: 'input3' }, { group: 'c', tab: '2', name: 'input4' }, { group: 'a', tab: '1', name: 'input5' }, { group: 'c', tab: '2', name: 'input6' }],
    result = Array.from(
        data.reduce(
            (m, { tab, group }) => m.set(tab, (m.get(tab) || new Set).add(group)),
            new Map
        ),
        ([tab, groups]) => ({ ['tab' + tab]: { groups: Array.from(groups) } })
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 23 сентября 2018

Попробуйте следующий код

const src = [
  { group: "a", tab: "1", name: "input1" },
  { group: "b", tab: "1", name: "input2" },
  { group: "b", tab: "1", name: "input3" },
  { group: "c", tab: "2", name: "input4" },
  { group: "a", tab: "1", name: "input5" },
  { group: "c", tab: "2", name: "input6" },
];

const convert = (src) => {
  const dst = [];
  Object.keys(src).forEach((item) => {
    const tab = `tab${src[item].tab}`;
    // Check if dst[tab] does not exist
    if (typeof (dst[tab]) === 'undefined') {
      dst[tab] = { groups: [] };
    }
    // Check if groups contains group
    if (!dst[tab].groups.includes(src[item].group)) {
      dst[tab].groups.push(src[item].group);
    }
  });
  return dst;
};

console.log(convert(src));
0 голосов
/ 23 сентября 2018

Вы можете просто использовать Array.reduce(), чтобы создать карту и сгруппировать ее по Tab, Object.values() на карте даст вам желаемый результат.

let arr =[ {group: "a", tab: "1", name: "input1"}, {group: "b", tab: "1", name: "input2"}, {group: "b", tab: "1", name: "input3"}, {group: "c", tab: "2", name: "input4"}, {group: "a", tab: "1", name: "input5"}, {group: "c", tab: "2", name: "input6"}];

let result = Object.values(arr.reduce((a, {group, tab})=>{
  a[tab] = a[tab] || {["tab"+tab] : {group : []}};
  if(!a[tab]["tab"+tab].group.includes(group))
    a[tab]["tab"+tab].group.push(group);
  return a;
},{}));

console.log(result);

:

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