Возврат нескольких наборов агрегированных идентификаторов из массива объектов - PullRequest
0 голосов
/ 21 марта 2020

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

Например - в этом массиве объектов есть два атрибута, которые появляются в более чем один объект (A и C с 3 и 2 значениями соответственно).

Формат результата, который мне нужен, будет массивом массивов, содержащим идентификаторы рассматриваемых объектов (см. строку результата) , Я пробовал разные типы фильтров, но безрезультатно.

let data = [
  { id: 1, attribute: "A" },
  { id: 2, attribute: "b" },
  { id: 3, attribute: "C" },
  { id: 4, attribute: "A" },
  { id: 5, attribute: "e" },
  { id: 6, attribute: "C" },
  { id: 7, attribute: "g" },
  { id: 8, attribute: "h" },
  { id: 9, attribute: "A" }
];

let result = [
  [1, 4, 9],
  [3, 6]
];

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Сначала вы можете использовать метод массива reduce() для группировки объектов по ключу attribute и получения необходимых идентификаторов в группе, например:

let data = [
    {id:1, attribute:"A"}
  , {id:2, attribute:"b"}
  , {id:3, attribute:"C"}
  , {id:4, attribute:"A"}
  , {id:5, attribute:"e"}
  , {id:6, attribute:"C"}
  , {id:7, attribute:"g"}
  , {id:8, attribute:"h"}
  , {id:9, attribute:"A"}];

let result = Object.values(data.reduce((o, obj) => {
  o[obj.attribute] = (o[obj.attribute] || []).concat(obj);
  return o; 
}, {})).filter(({length}) => length>1).map(x=> x.map(({id}) => id));

console.log(result)
0 голосов
/ 21 марта 2020

Пожалуйста, используйте Array.reduce для упрощения.

let data = [
  { id: 1, attribute: "A" },
  { id: 2, attribute: "b" },
  { id: 3, attribute: "C" },
  { id: 4, attribute: "A" },
  { id: 5, attribute: "e" },
  { id: 6, attribute: "C" },
  { id: 7, attribute: "g" },
  { id: 8, attribute: "h" },
  { id: 9, attribute: "A" }
];

let result = [
  [1, 4, 9],
  [3, 6]
];
let results = data.reduce((x, {id, attribute}) => {
  if(!x[attribute]) x[attribute] = []
  x[attribute].push(id)
  return x
},{})
let finalResult = []
for( let key in results) {
  const value = results[key]
  if(value.length > 1) finalResult.push(value)
}
console.log(finalResult)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...