用静态方法实现列表 javascript
implement a list with a static method javascript
我必须按照以下说明重新实现一个列表和 forEach 方法:
// 不要 在您的解决方案中构造任何数组文字 ([])。
// 不要 在你的解决方案中通过 new Array 构造任何数组。
// 请不要在您的解决方案中使用任何Array.prototype方法。
// 您可以使用 Iterable 中的解构和扩展 (...) 语法。
结果应如下所示:
const list = List.create(1, 2)
list.forEach((item) => console.log(item))
这是我不完整的解决方案:
export class List {
constuctor(){
}
public static create(...values: number[]): List {
// Do *not* construct any array literal ([]) in your solution.
// Do *not* construct any arrays through new Array in your solution.
// DO *not* use any of the Array.prototype methods in your solution.
// You may use the destructuring and spreading (...) syntax from Iterable.
List list = new List();
values.forEach(function(item){
list.push(item);
});
return list;
}
public forEach(callback: any){
for (let i = 0; i<this.length ; i++){
callback(this[i], i, this);
}
}
}
在创建循环中,但问题是,作为静态方法,this 无法识别
已编辑感谢评论
...this
is not recognised
是的。但是你还没有给 this
任何 属性。这是因为:
constuctor
应该写成constructor
- 您需要定义一个
push
方法(因为您在 create
中调用了它)
- 您需要定义一个
length
属性(因为您在 forEach
中引用了它)
此外,还有一些其他问题:
- 您写的是
Array.prototype
函数不能使用,但是您的代码有 values.forEach()
,...所以这违反了该规则。请改用 for..of
循环。
这是你的代码,其中包含这些评论:
class List {
constructor() {
this.length = 0;
}
push(value) {
this[this.length++] = value;
}
static create(...values) {
let list = new List();
for (let item of values) {
list.push(item);
}
return list;
}
forEach(callback) {
for (let i = 0; i < this.length ; i++) {
callback(this[i], i, this);
}
}
}
const list = List.create(1, 2)
list.forEach((item) => console.log(item))
备注
上面的“测试”会很好,但是当对属性的赋值也能正常工作时,比如 list[2] = 3
,那么还有更多事情需要处理。以这个程序为例:
const list = List.create(1, 2);
list[5] = 42; // should update length
list.check = true; // should not update length
console.log("length = " + list.length);
console.log("enumerable keys are " + Object.keys(list));
list.forEach((item) => console.log(item)); // should not output empty slots
list.length = 1; // should delete some index properties
list.forEach((item) => console.log(item)); // should not output deleted items
...那么输出应该是:
length = 6
enumerable keys are 0,1,5,check
1
2
42
1
您可以通过捕获对属性的访问并使 length
成为 getter/setter 来实现这一点。但是您还需要区分属于 数组索引 和哪些不是的属性,因此 all-in-all 这将使代码变得不那么琐碎。
我必须按照以下说明重新实现一个列表和 forEach 方法:
// 不要 在您的解决方案中构造任何数组文字 ([])。
// 不要 在你的解决方案中通过 new Array 构造任何数组。
// 请不要在您的解决方案中使用任何Array.prototype方法。
// 您可以使用 Iterable 中的解构和扩展 (...) 语法。
结果应如下所示:
const list = List.create(1, 2)
list.forEach((item) => console.log(item))
这是我不完整的解决方案:
export class List {
constuctor(){
}
public static create(...values: number[]): List {
// Do *not* construct any array literal ([]) in your solution.
// Do *not* construct any arrays through new Array in your solution.
// DO *not* use any of the Array.prototype methods in your solution.
// You may use the destructuring and spreading (...) syntax from Iterable.
List list = new List();
values.forEach(function(item){
list.push(item);
});
return list;
}
public forEach(callback: any){
for (let i = 0; i<this.length ; i++){
callback(this[i], i, this);
}
}
}
在创建循环中,但问题是,作为静态方法,this 无法识别
已编辑感谢评论
...
this
is not recognised
是的。但是你还没有给 this
任何 属性。这是因为:
constuctor
应该写成constructor
- 您需要定义一个
push
方法(因为您在create
中调用了它) - 您需要定义一个
length
属性(因为您在forEach
中引用了它)
此外,还有一些其他问题:
- 您写的是
Array.prototype
函数不能使用,但是您的代码有values.forEach()
,...所以这违反了该规则。请改用for..of
循环。
这是你的代码,其中包含这些评论:
class List {
constructor() {
this.length = 0;
}
push(value) {
this[this.length++] = value;
}
static create(...values) {
let list = new List();
for (let item of values) {
list.push(item);
}
return list;
}
forEach(callback) {
for (let i = 0; i < this.length ; i++) {
callback(this[i], i, this);
}
}
}
const list = List.create(1, 2)
list.forEach((item) => console.log(item))
备注
上面的“测试”会很好,但是当对属性的赋值也能正常工作时,比如 list[2] = 3
,那么还有更多事情需要处理。以这个程序为例:
const list = List.create(1, 2);
list[5] = 42; // should update length
list.check = true; // should not update length
console.log("length = " + list.length);
console.log("enumerable keys are " + Object.keys(list));
list.forEach((item) => console.log(item)); // should not output empty slots
list.length = 1; // should delete some index properties
list.forEach((item) => console.log(item)); // should not output deleted items
...那么输出应该是:
length = 6
enumerable keys are 0,1,5,check
1
2
42
1
您可以通过捕获对属性的访问并使 length
成为 getter/setter 来实现这一点。但是您还需要区分属于 数组索引 和哪些不是的属性,因此 all-in-all 这将使代码变得不那么琐碎。