Расположение команд в группе

218
31 августа 2018, 00:10
var teamsFirst = [
    { name: "Barcelona", country: "Spain" },
    { name: "Real Madrid", country: "Spain" },
    { name: "MU", country: "England" },
    { name: "Totenham", country: "England" }
];
var teamsSecond = [
    { name: "Atletico Madrid", country: "Spain" },
    { name: "Valencia", country: "Spain" },
    { name: "Chelsea", country: "England" },
    { name: "Arsenal", country: "England" }
];
var groupA = [];
var groupB = [];
var groupC = [];
var groupD = [];
var groups = [
    groupA, groupB, groupC, groupD
];
function compareRandom() {
    return Math.random() - 0.5;
}
function printTeams() {
    for ( let i = 0; i < groups.length; i += 1 ) {
        console.log('Group ' + i + ": " + groups[i][0].name + " and " + groups[i][1].name);
    }
}
function checkTeams() {
    var response = false;
    for ( var i = 0; i < groups.length; i += 1 ) {
        if ( groups[i][0].country === groups[i][1].country ) {
            response = true;
        }
    }
    return response;
}
function cleanGroups() {
    groupA = [];
    groupB = [];
    groupC = [];
    groupD = [];
}
    for ( var j = 0; j < 100; j++ ) {
        teamsFirst.sort(compareRandom);
        teamsSecond.sort(compareRandom);
        for ( let i = 0; i < groups.length; i += 1 ) {
            groups[i].push(teamsFirst[i]);
            groups[i].push(teamsSecond[i]);
        }
        var answer = checkTeams();
        if (!answer) {
            printTeams();
            break;
        } else {
            cleanGroups();
        }
    }

Задача программы - сортировать команды в группы так, чтобы в одной группе не было команд с одной и той же страны. Проблема заключается в следующем: если последний for заменить на while, то программа будет выполняться бесконечно, и команды никогда не выведутся в консоль. Но, если for оставить, то они иногда появляются. Как исправить программу так, чтобы происходила сортировка команд, потом проверка ( есть ли команды в одной группе одинаковыми странами ), и в конце - вывод?

Answer 1

Перебираем команды первой группы и для каждой ищем первую подходящую из второй. Подходящие из второй убираем совсем чтоб они не продублировались в другой паре.

let teamsFirst = [ 
    { name: "Barcelona", country: "Spain" }, 
    { name: "Real Madrid", country: "Spain" }, 
    { name: "MU", country: "England" }, 
    { name: "Totenham", country: "England" } 
]; 
 
let teamsSecond = [ 
    { name: "Atletico Madrid", country: "Spain" }, 
    { name: "Valencia", country: "Spain" }, 
    { name: "Chelsea", country: "England" }, 
    { name: "Arsenal", country: "England" } 
]; 
 
let groupA = [], 
    groupB = [], 
    groupC = [], 
    groupD = []; 
 
let groups = [ 
    groupA, groupB, groupC, groupD 
]; 
 
function compareRandom(a, b) 
{ 
    return Math.random() - 0.5; 
} 
 
function printTeams() 
{ 
    for (let i = 0; i < groups.length; i++) { 
        console.log(`Group #${i}: ${groups[i][0].name} (${groups[i][0].country}) VS ${groups[i][1].name} (${groups[i][1].country})`); 
    } 
} 
 
teamsFirst.sort(compareRandom); 
teamsSecond.sort(compareRandom); 
 
for (let f = 0, first; f < teamsFirst.length; f++) { 
    first = teamsFirst[f]; 
    groups[f].push(first); 
 
    for (let s = 0, second; s < teamsSecond.length; s++) { 
        second = teamsSecond.shift(); 
        if (second.country !== first.country) { 
            groups[f].push(second); 
            break; 
        } 
        teamsSecond.push(second); 
  } 
} 
 
printTeams();

Answer 2

var teamsFirst = [ 
    { name: "Barcelona", country: "Spain" }, 
    { name: "Real Madrid", country: "Spain" }, 
    { name: "MU", country: "England" }, 
    { name: "Totenham", country: "England" } 
]; 
 
var teamsSecond = [ 
    { name: "Atletico Madrid", country: "Spain" }, 
    { name: "Valencia", country: "Spain" }, 
    { name: "Chelsea", country: "England" }, 
    { name: "Arsenal", country: "England" } 
]; 
 
var groupA = []; 
var groupB = []; 
var groupC = []; 
var groupD = []; 
 
var groups = [ 
    groupA, groupB, groupC, groupD 
]; 
 
function randomIntegr() { 
  var random = Math.random() * 4; 
  return Math.floor(random); 
} 
 
 
function randomGroups(teams) { 
teams.forEach(team =>{ 
var random = randomIntegr(); 
if (!groups[random].length){ 
  groups[random].push(team); 
} else if (groups[random].some(item => {return item.country !== team.country}) && groups[random].length < 2){         
  groups[random].push(team); 
} else { 
  for (group of groups){ 
    if (!group.length){ 
      group.push(team); 
      break; 
    } else if (group.some(item => {return item.country  !== team.country}) && group.length < 2){ 
      group.push(team); 
      break; 
    } 
  } 
} 
}) 
} 
 
randomGroups(teamsFirst); 
randomGroups(teamsSecond); 
for (val of groups){ 
  console.log(`${val[0].name} vs ${val[1].name}`); 
}

READ ALSO
Поиск значения в массиве объектов и вывод его порядкового номера с ключом

Поиск значения в массиве объектов и вывод его порядкового номера с ключом

Дан массив объектовНайти введенное значение в массиве и выести порядковый номер элемента массива с ключом, в котором оно записано

170
Как проверить 3 input сразу?

Как проверить 3 input сразу?

Почему то у меня проверяет только один input вместо каждого с name=oneКто может подсказать как сделать проверку каждого input name="one" ?

172
Работа с файлом, полученным из input &ldquo;file&rdquo; [закрыт]

Работа с файлом, полученным из input “file” [закрыт]

Стоит задача изdocx документа импортировать текст в md

165