ES6类 - 映射变量数组

3

假设我有一个由5个人名组成的列表

let listNames = [Sam, Ash, Moe, Billy, Kenzi]

我想为每个名称使用类属性doneHomeWorklazy

class Person {
    constructor() {
        this.doneHomeWork = 0
        this.lazy = false
    }
}

不要像这样为每个名称指定:

const Sam = new Person()
const Ash = new Person()
const Moe = new Person()
const Billy = new Person()
const Kenzi = new Person()

我在考虑做这件事。
listNames.forEach(name => {
    name = new Person()
})

然而,在我的ESLint中,它给了我一个错误

将函数参数“name”分配给无效的变量‘no-param-reassign’

这似乎是微不足道的,但出于某种原因,我很难进行重构。

4个回答

2
你可以使用ES6数组解构,并将每个名称分配给Person类的新实例。

class Person {
  constructor() {
    this.doneHomeWork = 0;
    this.lazy = false;
  }
}


const [Sam, Ash, Moe, Billy, Kenzi] = Array.from(Array(5), e => new Person)

console.log(Sam)
console.log(Ash)


1
是的,但这种方式假定人数是有限的。否则,这个解决方案就不能是动态的,也无法应用。我认为他想知道如何迭代一个人员数组并创建相应的对象。 - quirimmo

2
问题在于变量名“name”用于循环内。您在循环的第一次迭代中更改了此值。这是您错误的原因Assignment to function parameter 'name' no-param-reassign
然后,您尝试将动态名称用作变量名称。如果您想这样做,方法是使用方括号表示法,因此您可以这样做:
class Person {
    constructor() {
        this.doneHomeWork = 0
        this.lazy = false
    }
}
let persons = [];
let listNames = ['Sam', 'Ash', 'Moe', 'Billy', 'Kenzi'];

correctListNames.forEach(name => {
    persons[name] = new Person()
})

console.log(persons);

太棒了!我刚刚修改了 let persons = {},这样我就可以避免插入一个数组,而且 correctListNames 应该是 listNames。除此之外,谢谢! - Alejandro
可以使用相同的符号访问Sure对象。不客气 :) - quirimmo

1

不要试图动态生成这个

const Sam = new Person();
const Randy = new Person():

您可以通过类似以下方式获得类似的东西,
const persons = {
  Sam: new Person(),
  Randy: new Person(),
};

然后您可以使用persons['Sam']persons.Sam来访问它们。 现在,要从数组中实现这一点,
const arr = ['Sam', 'Randy'];
const persons = {};
arr.forEach(name => {
  persons[name] = new Person();
});

关于您收到的 eslint 警告是因为您正在尝试更改函数参数的值。您可以通过在 eslint 配置文件中将规则设置为 0 来关闭它。但是我建议不要关闭它。

0
你可以使用ES6解构特性来实现这个功能:

class Person {
    constructor() {
        this.doneHomeWork = 0
        this.lazy = false
    }
}
let arr = [];
for(let i=0;i<6;i++) {
 arr.push(new Person());
}


const [Sam, Ash, Moe, Billy, Kenzi] = [...arr];

console.log(Sam);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接