JS - преобразовать массив объектов в объект так, чтобы новый объект содержал уникальные слова - PullRequest
0 голосов
/ 06 мая 2020

У меня есть массив объектов. Каждый объект имеет два ключа: id и текст.

let o = [
  {
    id: 1,
    text: "Lorem ipsum dolor sit amet consectetur"
  },
  {
    id: 2,
    text: "Lorem ipsum dolor sit amet consectetur Dolorem"
  },
  {
    id: 3,
    text: "amet consectetur Dolorem"
  }
]

Мне нужно преобразовать этот массив в объект, чтобы объект содержал уникальные слова. И значение этих слов представляет собой список, содержащий id того же объекта, что и слово.

Результат

{
  Dolorem:  [2, 3]
  Lorem: [1, 2]
  amet:  [1, 2, 3]
  consectetur: [1, 2, 3]
  dolor:  [1, 2]
  ipsum:  [1, 2]
  sit:  [1, 2]
}

Как это сделать?

1 Ответ

1 голос
/ 06 мая 2020

Уменьшить массив. Обрежьте, разделите текст и создайте Набор слов, чтобы получить только уникальные слова. Итерируйте набор с помощью Set.foreach() и добавьте каждое слово к объекту, если оно не существует. Пу sh текущий id в массив слов:

const arr = [{"id":1,"text":"Lorem ipsum dolor sit amet consectetur"},{"id":2,"text":"Lorem ipsum dolor sit amet consectetur Dolorem"},{"id":3,"text":"amet consectetur Dolorem"}];

const result = arr.reduce((r, { id, text }) => {
  new Set(text.trim().split(/\s+/))
    .forEach(w => {
      if(!r[w]) r[w] = [];
      r[w].push(id);
    });

  return r;
}, {});

console.log(result);

Без учета регистра и только букв:

const arr = [{"id":1,"text":"Lorem 10 ipsum -- dolor sit amet consectetur"},{"id":2,"text":"Lorem ipsum dolor sit 20 amet! consectetur Dolorem"},{"id":3,"text":"amet consectetur Dolorem!!!"}];

const result = arr.reduce((r, { id, text }) => {
  new Set(text.trim().toLowerCase().match(/[a-z]+/g))
    .forEach(w => {
      if(!r[w]) r[w] = [];
      r[w].push(id);
    });

  return r;
}, {});

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