Saltar al contenido

¿Es posible crear una longitud fija? array en javascript?

Te damos el resultado a este atasco, o por lo menos eso deseamos. Si sigues con inquietudes coméntalo, que con gusto te responderemos

Solución:

Actualizar:

Object.seal (que es parte de ES2015) hará precisamente eso:

// create array with 42 empty slots
let a = new Array(42);

if(Object.seal) 
  // fill array with some value because
  // empty slots can not be changed after calling Object.seal
  a.fill(undefined);

  Object.seal(a);
  // now a is a fixed-size array with mutable entries

Respuesta original:

Casi. Como sugirió titusfx, puede congelar el objeto:

let a = new Array(2);

// set values, e.g.
a[0] =  b: 0; 
a[1] = 0;

Object.freeze(a);

a.push(); // error
a.pop(); // error
a[1] = 42; // will be ignored
a[0].b = 42; // still works

Sin embargo, no puede cambiar los valores de un objeto congelado. Si tienes un array de objetos, esto puede no ser un problema, ya que aún puede cambiar los valores de los objetos.

Para matrices de números, por supuesto, existen matrices escritas.

Object.freeze es parte de ES2015, pero la mayoría de los navegadores parecen admitirlo, incluido IE9. Por supuesto, podría probarlo con funciones:

if(Object.freeze) Object.freeze(obj);

Actualizar:

La respuesta aceptada muestra cómo este problema pueden ahora se resuelve usando Object.seal que no estaba disponible en ese momento.

Respuesta original:

Entonces, parece que la respuesta a la pregunta original es simplemente ‘No’. No es posible crear una matriz javascript nativa con una longitud fija.

Pero puede crear un objeto que se comportará como una matriz de longitud fija. Siguiendo las sugerencias en los comentarios, se me ocurrieron 2 posibles implementaciones, con pros y contras.

Todavía no he descubierto cuál de los 2 voy a usar en mi proyecto. No estoy 100% satisfecho con ninguno de los dos. Por favor, avíseme si tiene alguna idea para mejorarlos (estoy interesado en hacer estos objetos lo más rápido y eficiente posible porque voy a necesitar muchos de ellos).

Código para ambas implementaciones a continuación, junto con las pruebas QUnit que ilustran el uso.

// Version 1
var FixedLengthArrayV1 = function(size) 
    // create real array to store values, hidden from outside by closure
    var arr = new Array(size);
    // for each array entry, create a getter and setter method
    for (var i=0; i

En realidad, para crear un true c como fijo array en js en la mayoría de los navegadores modernos (incluido IE 11) puede usar: TypedArray o ArrayBuffer así:

var int16 = new Int16Array(1); // or Float32Array(2)
int16[0] = 42;
console.log(int16[0]); // 42
int16[1] = 44;
console.log(int16[1]); // undefined

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

valoraciones y comentarios

Puedes confirmar nuestra labor escribiendo un comentario y puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *