Buscando una forma de crear una matriz de objetos que tenga un tamaño fijo de 3 que la llene con valores predeterminados, pero cuando llegue a la matriz, debería reemplazar los valores predeterminados.
Ejemplo :
Declarar una matriz que llena la matriz con una cadena de "valor predeterminado"
["default value", "default value", "default value"]Ahora envío algo de texto a esta matriz inicial y espero lo siguiente:
["Added Data", "Default value", "Default Value"]Empujo más datos a esta matriz y espero lo siguiente:
["Added Data", "Added Data", "Default Value"]Nuevamente, envío más datos a esta matriz y espero lo siguiente:
["Added Data", "Added Data", "Added Data"]Entonces, el resultado final debería ser si inserta un dato, entonces el resto de la matriz debe seguir siendo el valor predeterminado a menos que inserte los tres datos en la matriz.
Nota : este ejemplo es una matriz de cadenas solo para mostrar un ejemplo, pero la solución que estoy buscando es una matriz de objetos. El método Array.fill() funciona muy bien para valores inmutables de JavaScript como cadenas, números y booleanos. Matriz con objetos, cada ranura en la matriz se refiere al mismo objeto que no es lo que estoy buscando. Quiero que cada objeto sea único.
Puede extender la clase Array para que tenga el comportamiento que describió ...
class FixedArray extends Array { /** * Contruct a fixed-length Array * @param int length - length of the array * @param mixed default_value - The default value for empty slots */ constructor(length, default_value) { super(length); this.default_value = default_value; super.fill(default_value); } /** * "Push" items onto the begining of the array (unshift) * @params ...args mixed - values to put in the array */ push(...args) { args.forEach(arg => { super.pop(); super.unshift(arg); }); } /** * Pop an item off the end of the array * and replace it with the default value */ pop(){ super.pop(); super.push(this.default_value); } /** * Shift an item off the start of the array * and replace it with the default value */ shift(){ super.shift(); super.unshift(this.default_value); } } var arr = new FixedArray(4, 'default value'); console.log(arr); arr.push('new value'); console.log(arr); arr.push('new value'); console.log(arr); arr.pop(); console.log(arr);Y para abordar la parte sobre el método de relleno de la matriz, puede agregar un método para simplemente copiar cualquier valor que ingrese en él ...
/** * Fill the array with copies of whatever arguments are provided. * Fills by value, not by reference. */ fill(...args){ args.forEach(arg=>{ let copy = JSON.parse(JSON.stringify(arg)); this.push(arg); }); }Para crear y llenar la matriz con un valor de objeto único predeterminado:
const tuple = new Array(3).fill(0).map(() => ({ foo: "bar" })) // or const defaultObject = { foo: "bar" } const tuple = new Array(3).fill(0).map(() => ({ …defaultObject }))Para agregar un nuevo elemento y mantener constante el tamaño de la matriz
function addTo(tuple, newItem) { tuple.unshift(newItem) // add new item to beginning tuple.pop() // remove old item at the end }