Debo reimplementar una lista y el método forEach con las siguientes instrucciones:
// No construya ningún literal de matriz ([]) en su solución.
// No construya matrices a través de new Array en su solución.
// NO use ninguno de los métodos Array.prototype en su solución.
// Puede usar la sintaxis de desestructuración y propagación (...) de Iterable.
el resultado debe verse como:
const list = List.create(1, 2) list.forEach((item) => console.log(item))Aquí está mi solución incompleta:
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); } } }en el bucle de creación, pero el problema, como método estático, no se reconoce
EDITADO gracias a los comentarios
...
thisno se reconoce
Está. Pero no le has dado a this ninguna propiedad. Y esto es porque:
constuctor debe escribirse como constructorpush (ya que lo llama en create )length (ya que la hace referencia en forEach )Además, hay algunos otros problemas:
Array.prototype no se pueden usar, pero su código tiene values.forEach() , ... por lo que es una violación de esa regla. Utilice un bucle for..of en su lugar.Aquí está su código con esos comentarios tomados a bordo:
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)) La "prueba" anterior estará bien, pero cuando también las asignaciones a las propiedades funcionen correctamente, como list[2] = 3 , entonces hay más cosas de las que ocuparse. Tomemos por ejemplo este programa:
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... entonces la salida debería ser:
length = 6 enumerable keys are 0,1,5,check 1 2 42 1 Puede hacer que esto suceda interceptando el acceso a las propiedades y haciendo que length sea un getter/setter. Pero también necesitaría distinguir entre las propiedades que son índices de matriz y las que no lo son, por lo que, en general, eso haría que el código fuera menos trivial.