var obj = []; input.forEach(function (match) { var tokens = match.split(':'); var players = tokens[0].split(/vs./); var tempObj = 0; var homePlayer = players[0].split(/\s+/g).join(' ').trim(); var awayPlayer = players[1].split(/\s+/g).join(' ').trim(); if (!(tempObj = contains(homePlayer))) { var player = createPlayer(homePlayer) player = addScore(player, tokens[1], true); obj.push(player); } else { obj[tempObj] = addScore(obj[tempObj], tokens[1], true); } if (!(tempObj = contains(awayPlayer))) { var player = createPlayer(awayPlayer); player = addScore(player, tokens[1], false); obj.push(player); } else { obj[tempObj] = addScore(obj[tempObj], tokens[1], false); } }); obj.sort(function (x, y) { if (x.matchesWon !== y.matchesWon) { return (y.matchesWon - x.matchesWon); } if (x.setsWon !== y.setsWon) { return (y.setsWon - x.setsWon); } if (x.gamesWon !== y.gamesWon) { return (y.gamesWon - x.gamesWon); } return x.name.localeCompare(y.name); }); function createPlayer(name) { var player = {}; player.name = name; player.matchesWon = 0; player.matchesLost = 0; player.setsWon = 0; player.setsLost = 0; player.gamesWon = 0; player.gamesLost = 0; return player; } function contains(player) { for (var i in obj) { if(obj[i].name === player) { return i; } } return null; } function addScore(player, score, isHome) { var sets = score.trim().split(/\s+/g); var setsWon = 0; var setsLost = 0; sets.forEach(function (set) { var match = set.split('-'); player.gamesWon += (isHome) ? Number(match[0]) : Number(match[1]); player.gamesLost += (!isHome) ? Number(match[0]) : Number(match[1]); if (Number(match[0]) > Number(match[1])) { setsWon = (isHome) ? setsWon + 1 : setsWon + 0; setsLost = (!isHome) ? setsLost + 1 : setsLost + 0; } else { setsWon = (!isHome) ? setsWon + 1 : setsWon + 0; setsLost = (isHome) ? setsLost + 1 : setsLost + 0; } }); player.setsWon += setsWon; player.setsLost += setsLost; if (setsWon > setsLost) { player.matchesWon += 1; } else { player.matchesLost += 1; } return player; } console.log(JSON.stringify(obj));