Basic JavaScript - 如何随机比较对象数组中的两个属性

Basic JavaScript - How to randomly compare two properties from an array of objects

我有一个练习,从一个对象构造函数,我创建了几个对象,所有对象都有一个 ID 属性。

练习的第一部分包括配对每个对象,比较它们的 markAv 属性并打印更大的对象。

[a vs b => b 赢]

他们建议使用 ID 属性 来这样做,但我不知道该怎么做...所以我尝试了一种解决方法,您将在下面的代码中看到。

然而,练习的第二部分要我做同样的事情,但这次是随机创建对。在这里,我尝试通过生成一个与 ID 匹配的随机数来使用 ID 属性,但我不知道如何构建代码以使其工作。

第二部分的输出应该与上面相同,唯一的区别是配对现在是随机生成的。

我为第二部分添加了一个部分解决方案,部分解决方案是因为它有时会抛出一个我无法识别的错误。但是,我想我已经接近获得我想要的输出了。

如果有人能给我提示让我破解下面的代码并让它工作,我将不胜感激,因为我真的很想了解如何做到这一点。

class Avenger {
  constructor(name, classRoom, city, job, studies, markAv, id) {
    this.name = name;
    this.classRoom = classRoom;
    this.city = city;
    this.job = job;
    this.studies = studies;
    this.markAv = markAv;
    this.id = id;

  }

  heroList() {
    return this.name + " " + this.classRoom + " " + this.city + " " + this.job + " " + this.studies + " " + this.markAv + " " + this.id
  }

}

const tonyStark = new Avenger("Tony Stark", "XI", "NYC", "Ingeneer", "MIT", 10, 1)
const hulk = new Avenger("Hulk", "X", "Toledo", "Destroyer", "Scientific", 7, 2)
const daredevil = new Avenger("Daredevil", "IX", "NYC", "Lawyer", "Fighter", 2, 3)
const magneto = new Avenger("Magneto", "XXI", "SBD", "Unemployed", "Driver", 5, 4)
const unknown = new Avenger("Unknown", "L", "CDY", "President", "Clerck", 17, 5)
const xavi = new Avenger("Xavi", "XX", "BCN", "Analist", "Calle", 7, 6)


let heroes = [daredevil, hulk, tonyStark, magneto, unknown, xavi]


function getPairs(array) {

  function getPairs(array) {
    for (let i = 0; i < array.length; i += 2) {
      if (array[i].markAv < array[i + 1].markAv) {
        console.log(array[i].name + " vs " + array[i + 1].name + " " + array[i + 1].name + " Wins")
      } else if (array[i].markAv > array[i + 1].markAv) {
        console.log(array[i].name + " vs " + array[i + 1].name + " " + array[i].name + " Wins")
      }
    }
  }

  getPairs(heroes)

///

  function randomAv(array) { 
      let result = []
      let hero1 = heroes[Math.floor(Math.random() * 6) + 1]
      for(let i = 0; i<array.length; i++){
      if (array[i].markAv <= hero1.markAv && array[i].id != hero1.id) {
        result.push(console.log(array[i].name + " vs " + hero1.name + " " + array[i].name + " Wins"))
      } else if(array[i].markAv >= hero1.markAv && array[i].id != hero1.id) {
        result.push(console.log(array[i].name + " vs " + hero1.name + " " + hero1.name + " Wins"))
      }
    }
    console.log(result)
    }

你可以从这里获取函数

然后做这样的事情:

class Avenger {
  constructor(name, classRoom, city, job, studies, markAv, id) {
    this.name = name;
    this.classRoom = classRoom;
    this.city = city;
    this.job = job;
    this.studies = studies;
    this.markAv = markAv;
    this.id = id;

  }

  heroList() {
    return this.name + " " + this.classRoom + " " + this.city + " " + this.job + " " + this.studies + " " + this.markAv + " " + this.id
  }

}

const tonyStark = new Avenger("Tony Stark", "XI", "NYC", "Ingeneer", "MIT", 10, 1)
const hulk = new Avenger("Hulk", "X", "Toledo", "Destroyer", "Scientific", 7, 2)
const daredevil = new Avenger("Daredevil", "IX", "NYC", "Lawyer", "Fighter", 2, 3)
const magneto = new Avenger("Magneto", "XXI", "SBD", "Unemployed", "Driver", 5, 4)
const unknown = new Avenger("Unknown", "L", "CDY", "President", "Clerck", 17, 5)
const xavi = new Avenger("Xavi", "XX", "BCN", "Analist", "Calle", 7, 6)


let heroes = [daredevil, hulk, tonyStark, magneto, unknown, xavi]

function randomIntFromInterval(min, max) { // min and max included 
  return Math.floor(Math.random() * (max - min + 1) + min)
}

let hero1 = heroes[randomIntFromInterval(1, 6)]
let hero2 = heroes[randomIntFromInterval(1, 6)]

if (hero1.markAv < hero2.markAv) {
  console.log(hero1.name + " vs " + hero2.name + " " + hero1.name + " Wins")
} else if(hero1.markAv > hero2.markAv) {
  console.log(hero1.name + " vs " + hero2.name + " " + hero2.name + " Wins")
}

首先打乱数组:

let heroes = [daredevil, hulk, tonyStark, magneto, unknown, xavi]
let heroes_shuffle = heroes.sort((a, b) => 0.5 - Math.random())

然后照常进行

getPairs(heroes_shuffle )

所有可能的组合:

function allPairs(heroes) {
    while (heroes) {
        [hero, ...heroes] = heroes
        for (enemy of heroes) {
            if (hero.markAv === enemy.markAv)
                console.log(hero.name + " vs " + enemy.name + ": draw")
            else if (hero.markAv < enemy.markAv)
                console.log(hero.name + " vs " + enemy.name + ": " + enemy.name + " Wins")
            else
                console.log(hero.name + " vs " + enemy.name + ": " + hero.name + " Wins")
        }
    }
}