Массив объектов, созданный из подстрок его поля

Подскажите, пожалуйста эффектиный алгоритм на js чтобы получить из массива объектов

  [
    {
        "id": "1"
        "tag": "PS3, PS4",
        ...
    },
    {
        "id": "2"
        "tag": "PS4, PS5",
        ...
    },
    ...
   ]

Вот такой массив объектов

[
    {
        "id": "1"
        "tag": "PS3",
        ...
    },
    {
        "id": "1"
        "tag": "PS4",
        ...
    },
    {
        "id": "2"
        "tag": "PS4",
        ...
    },
    {
        "id": "2"
        "tag": "PS5",
        ...
    },
    ...
   ]

Ответы (3 шт):

Автор решения: Qwertiy

var a = [
  { "id": "1", "tag": "PS3, PS4", abc: 13    },
  { "id": "2", "tag": "PS4, PS5", cde: "qqq" },
]

var res = a.flatMap(x => x.tag.split(/,\s*/).map(t => ({ ...x, tag: t })))

console.log(res)
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка
Автор решения: splash58

так, для экзотики, решение на генераторе

function* generator(arr) {
  for (let x of arr) {  
      for (let i of x.tag.split(', ')) {
         x.tag = i;
         yield Object.assign({}, x)
      }
   }
}   

let arr = [
   { "id": "1", "tag": "PS3, PS4", abc: 13    },
   { "id": "2", "tag": "PS4, PS5", cde: "qqq" },
]

let res = []

for(let val of generator(arr)) {
  res.push(val)
}

console.log(res)

→ Ссылка
Автор решения: Татьяна Компаниец

let array = [{
    "id": "1",
    "tag": "PS3, PS4",
  },
  {
    "id": "2",
    "tag": "PS4, PS5",
  },
]

var processedArray = array
  .map(x => {
    tags = x.tag.split(",");

    var tmp = [];

    tags.forEach(t => tmp.push({
      id: x.id,
      tag: t.trim()
    }));

    return tmp;
  })
  .reduce((x, y) => x.concat(y))

console.log(processedArray);

→ Ссылка