JavaScript Array of a class

7fyelxc5  于 2024-01-05  发布在  Java
关注(0)|答案(5)|浏览(94)

在JS中,我有一个名为player的类,它是:

class player {
    constructor(name) {
        this.name = name;
    }
}

字符串
我有两个示例,分别是PL1PL2

const PL1 = new player ('pl1name');
const PL2 = new player ('pl2name');


我也有一个名为PLAYERS的数组:

let PLAYERS = [];


现在的问题是,我如何才能创建一个数组,其中包含类player的所有示例?
我知道我可以用PLAYERS.push(PLn)手动完成这一操作;但我正在寻找一种自动完成这一操作的方法。有内置函数吗?我应该使用循环吗?

ff29svar

ff29svar1#

你可以为玩家创建一个容器类。这将允许容器创建玩家并管理他们。Players类可以公开一个接口,使其易于与单个或整体玩家进行交互。类似这样的东西可能是一个好的开始,可以用更多功能或不同的组织来填充:

// An individual player. Holds properties and behaviour for one player
class Player {
  constructor(name) {
      this.name = name;
  }
  play() {
    console.log(this.name, "plays")
  }
}

// Class that holds a collection of players and properties and functions for the group
class Players {
  constructor(){
    this.players = []
  }
  // create a new player and save it in the collection
  newPlayer(name){
    let p = new Player(name)
    this.players.push(p)
    return p
  }
  get allPlayers(){
    return this.players
  }
  // this could include summary stats like average score, etc. For simplicity, just the count for now
  get numberOfPlayers(){
      return this.players.length
  }
}

let league = new Players()
league.newPlayer("Mark")
league.newPlayer("Roger")

// list all the players
console.log(league.numberOfPlayers + " Players)
console.log(league.allPlayers)

// make them do something
league.allPlayers.forEach(player => player.play())

字符串

flseospp

flseospp2#

要使用静态数量的Player对象初始化Array,可以在数组中调用new Player()

const players = [new Player('name1'), new Player('name2'), new Player('name3')];

字符串
你也可以使用循环来动态地创建你的播放器列表:

const playerNames = ['name1', 'name2', 'name3'];
let players = [];
playerNames.forEach((playerName) => players.push(new Player(playerName)));

oyxsuwqo

oyxsuwqo3#

实际上你只想把数据写入数组,所以你需要一个二维数组。
接下来,您可以向数组写入值或从数组读取值。

class player {
constructor(name, val, ...) {
    this.name = name;
    this.val = val; // ....
}

toarr()
{
arr=[];
arr[0] = this.name;
arr[1] = this.val; //etcetera
return arr;
}

fromarr(arr){
this.name = arr[0];
this.val = arr[1]
...
}   
}

字符串
实际上你只需要一个player示例,每次都重置它的值来访问或创建其他的player。

reset( name, val){
this.name = name;
this.val = val; // ....}


所以,代码等于构造函数。
最终所有参与者的数组看起来有点像这样:

players = [];
current_player = new player (name, val);
players[0] = current_player.toarr();
current_player.reset(name1, val1);
players[1] = current_player.toarr();


current_player.fromarr[24];


(note你也可以编写类似current_player.byname(name)的代码)
如果你想比较两个球员,或者所有球员,你只需要两个球员的示例。
当写入一个二维数组时,你可以使用命名值。我喜欢这种方式。

const NAME = 0;
const VAL = 1;
etcetera


你可以很容易地添加一个值到数组中,通过添加一个val 2(weight,length,income,likes)你甚至可以添加names_of_children;一个二维数组中的数组。但是这可能会导致一些问题。
要比较玩家,或者对玩家进行排序,您也可以访问数组。
如果你把所有的代码都写在一个单独的文件中,并且这个文件只有在你访问和操作玩家的数据时才被加载,你不必创建一个het数组类,它也可以是一个模块。

if (we_use_the_players_array === true) {do load the players.js file}


刷新整个页面,所以其他.js文件不被使用

fykwrbwg

fykwrbwg4#

我现在无法评论你的回答,所以这里有一个补充:

class player {
    constructor(name){
        this.name = name;
        PLAYERS.push(this);
    }
}

字符串
请:要知道,在这几行中有很多糟糕的做法,你不应该把构造函数绑定到一个变量上,这个变量可能在其他地方被初始化,也可能没有被初始化,用任何外部变量来干预构造函数是非常糟糕的。
另外,作为一个旁注,虽然它是真实的,你可以改变consts属性,同时保持引用,所以你可以 * push对象在数组中声明为const,它真的不加起来作为自我文档化的代码,所以,如果你要修改这个数组,只是声明它与“让”从一开始。

ylamdve6

ylamdve65#

你可以将每个示例作为构造函数的一部分压入到类的静态数组中。(在最基本的形式下,这可能类似于下面的代码)
这个答案解释了更多:https://stackoverflow.com/a/71696802/19529102
链接的答案还提供了一个改进,修复了缺陷,在这个基本版本中,数组直接暴露/返回

class Player {

    static all = [];

    constructor(name) {
        this.name = name;
        Player.all.push(this);
    }
}

const PL1 = new Player("pl1name");
const PL2 = new Player("pl2name");

console.log(Player.all);
console.log(PL1.all); //undefined; instance of Player does not inherit all

const PL3 = new Player("pl3name");

console.log(Player.all);

字符串

相关问题