Если вы просто пытаетесь найти эти теги (без амбиций синтаксического анализа), попробуйте это регулярное выражение:
/<[^/]*?>/g
Я написал его через 30 секунд и протестировал здесь: http: //gskinner.com/RegExr/
Он соответствует типам тегов, о которых вы упомянули, игнорируя типы, которые вы сказали игнорировать.
Вероятно, не самое элегантное решение, но вот другое:
var data = {
rounds: [{
team: "Dropkick Murphies",
score: 75,
course: 17
},
...
]
};
var groups = {};
for (var o of data.rounds) {
if (!groups[o.team])
groups[o.team] = [];
groups[o.team].push({
score: o.score,
course: o.course
});
}
var result = [];
for (var g in groups) {
result.push({
team: g,
rounds: groups[g]
});
}
Одним из подходов для этого является использование Reduce () . На каждой итерации вы можете проверить, существует ли текущий анализируемый объект в накопленном массиве (т. Е. Объект с тем же team name
уже существует). Затем вы можете использовать это условие для добавления нового целого объекта в накопленный массив или просто добавить новый набор данных в массив rounds
:
const rounds = [
{team: "Dropkick Murphies", score: 75, course: 17},
{team: "Dropkick Murphies", score: 62, course: 24},
{team: "Dropkick Murphies", score: 69, course: 26},
{team: "Gigantic", score: 67, course: 26},
{team: "Gigantic", score: 65, course: 17},
{team: "Gigantic", score: 63, course: 24}
];
let res = rounds.reduce((r, {team, score, course}) =>
{
let found = r.findIndex(x => x.team === team);
if (found >= 0)
r[found].rounds.push({score: score, course: course});
else
r.push({team: team, rounds: [{score: score, course: course}]});
return r;
}, []);
console.log(res);
Вы можете сделать это, используя Reduce.
здесь мы используем team name
в качестве ключевого свойства и, проверяя, находится ли он уже в выходном объекте, нажимаем score
и course
в свойстве раундов этого конкретного командного ключа, если нет, то мы создаем новый ключ.
const rounds = [
{team: "Dropkick Murphies", score: 75, course: 17},
{team: "Dropkick Murphies", score: 62, course: 24},
{team: "Dropkick Murphies", score: 69, course: 26},
{team: "Gigantic", score: 67, course: 26},
{team: "Gigantic", score: 65, course: 17},
{team: "Gigantic", score: 63, course: 24}
];
let op = rounds.reduce((output,current)=>{
if(output[current.team]){
output[current.team].rounds.push({
score : current.score,
course: current.score
})} else {
output[current.team] = {
team: current.team,
rounds: [{score:current.score, course:current.course}]
}
}
return output
},{})
console.log(Object.values(op))
Вы можете реализовать вспомогательную функцию для преобразования.
function convertRoundsToLeaderBoard(rounds) {
var indexes = {};
var leaderBoard = [];
for (var round of rounds) {
if (indexes[round.team] === undefined) {
indexes[round.team] = leaderBoard.length;
leaderBoard.push({
team: round.team,
rounds: [{score: round.score, course: round.course}]
});
} else {
leaderBoard[indexes[round.team]].rounds.push({score: round.score, course: round.course});
}
}
return leaderBoard;
}
Давайте проверим это:
convertRoundsToLeaderBoard(
[
{
team: "Dropkick Murphies",
score: 75,
course: 17
},
{
team: "Dropkick Murphies",
score: 62,
course: 24
},
{
team: "Dropkick Murphies",
score: 69,
course: 26
},
{
team: "Gigantic",
score: 67,
course: 26
},
{
team: "Gigantic",
score: 65,
course: 17
},
{
team: "Gigantic",
score: 63,
course: 24
}
]);
Я бы посоветовал вводить ваши данные командой, используя Map
. Таким образом, вы можете построить свои данные с помощью цикла forEach
с линейной сложностью времени:
const rounds = [{team: "Dropkick Murphies",score: 75,course: 17},{team: "Dropkick Murphies",score: 62,course: 24},{team: "Dropkick Murphies",score: 69,course: 26},{team: "Gigantic",score: 67,course: 26},{team: "Gigantic",score: 65,course: 17},{team: "Gigantic",score: 63,course: 24}];
// Create Map with one entry per team
const map = new Map(rounds.map(({team}) => [team, []]));
// Populate each team with their scores
rounds.forEach(({team,score,course}) => map.get(team).push({score,course}));
// Convert the Map to the desired data structure
const result = Array.from(map, ([team, rounds]) => ({team, rounds}));
console.log(result);