2

Quería saber si es posible iniciar un array bidimensional con index 1 en vez de index 0.

Quiero iniciar las dos dimensiones en 1.

Y cómo definirlo cuándo el conjunto de elementos que va a tener el array viene dado por un input y son dos bucles los que se encargan de rellenar los valores con números consecutivos.

Para que quede más claro el problema copio el código que tengo ahora mismo, que inicia los arrays en 0.

this.prop = new Array(new Array());

this.metodo = function(var1, var2) {


    for (var i=0; i<var1; i++) {
        this.prop[i]=[var1];
        for (var j=0; j<var2; j++) {
            this.prop[i][j]=null;
        }
    }
}
x3k
  • 3,732
  • 10
  • 38
Miguel27
  • 540
  • 2
  • 14
  • 3
    no logro entender para que deseas que inicialize en 1 si el usuario no ve el arreglo :v – Bryro Jan 27 '20 at 19:00
  • El usuario sí verá algunos índices de la matriz, los que son mayores que 0. Intento utilizar los índices como forma de almacenar números naturales, como si fuese un array asociativo. Ya que si no tendría que darle una dimensión más al array. Ahora mismo la solución que le he dado es dejar los índices [0][j] y [i][0] siempre vacíos. Por lo que el array tiene más elementos de los necesarios :) – Miguel27 Jan 27 '20 at 19:41
  • 2
    Puedes crear una función get(x,y) que reste 1 a los parámetros para acceder a la coordenada que quieres – Pablo Lozano Jan 28 '20 at 09:52

2 Answers2

6

Hay un modo de hacer lo que quieres, pero no lo recomiendo porque es mucho trabajo y muchos detalles que pueden no funcionar: usar un Proxy. Es una clase avanzada de Javascript que no se suele conocer mucho, pero puede servir en determinados escenarios para modificar y/o monitorizar el comportamiento de objetos en un programa:

let originalArray= [];

let handler = {
// cada vez que se intenta llamar a una propiedad del objeto...
  get: function (obj,prop,receiver) { 
    //si es un número, le restamos 1
    if (typeof prop === 'string' && !isNaN(prop)) {
      prop = +prop -1;
    }
    // Si es una función (un método de Array), permitimos su uso "normal"
    if (typeof obj[prop] === 'function') {
      return obj[prop].bind(obj);
    }
    //devolvemos la propiedad
    return obj[prop.toString()];
  },
  set: function (obj,prop,value) {
    //Al asignar una propiedad, si el identificador es un número
    //restamos 1, en otro caso se asignará tal cual
    if (!isNaN(prop)) {
      prop = +prop -1;
    }
    obj[prop]=value;
    //hay que devolver true para indicar que todo ha ido bien
    return true;
  }
};

let proxy = new Proxy(originalArray, handler);
proxy[1]=4;
proxy[2]=5;
//los métodos de Array siguen usando el índice original, esto requeriría mucho más trabajo
proxy.forEach((item,index) => console.log('En la posición',index,'está el valor',item))
console.log(proxy.toString())

Realmente pongo esta solución como una curiosidad de Javascript, para lo que quieres es más sencillo restar 1 al índice que se recibe o sumar 1 al índice que se muestra al usuario.

Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
5

Lo principal es saber por que quieres realizar algo así y si es necesario.

Nota: No había visto lo de que el index es introducido por un input por el usuario. Esto aclara por que quieres que empiece en 1. Pero como comenta @Pablo Lozano lo mas sencillo es coger ese numero y restarle 1.


Javascript no tiene arrays asociativos.

Los arrays de javascript no pueden comenzar con un index que no sea 0.

Una vez que tenemos esto claro, vamos a las posibles opciones.


Opción 1: Ignorar el primer elemento

Por lo que aquí como ya se te ha ocurrido, lo que podrías hacer es ignorar el primer elemento insertando un valor auxiliar o nulo.

var array = ["ignorar",
                ["ignorar","1-primero","1-segundo"],
                ["ignorar","2-primero","2-segundo"]
            ];
array[1][1]; //output: 1-primero, la "primera" posición

Opción 2: object o JSON

Otra solución es crear objetos o JSONs:

var objeto = {
                1:{
                    1: "1-primero", 
                    2: "1-segundo"
                },
                2:{
                    1: "2-primero", 
                    2: "2-segundo", 
                }
            };
objeto[1][1]; //output: 1-primero, la primera posición

Para crearlo de forma dinámica:

var objeto = new Object();
objeto[1] = new Object();
objeto[1][1] = "1-primero";

No puedes acceder mediante el punto objeto.1.1 al usar claves numéricas.

Pero si mediante los corchetes [].

x3k
  • 3,732
  • 10
  • 38