6

Tengo el siguiente array:

var x = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

Tengo que comprobar que la posicion existe dentro del array. Por ejemplo x[4][1] deberia ser false, y x[2][2] ser true.

Hice la siguiente funcion:

function posicionValida(i,j){
  for (var i = 0; i < x.length; i++) {if (x[i]==undefined){
    return false}
      for (var j = 0; j < x.length; j++){
        if (x[j]==undefined){
          return false
  } else {return true} }}}

pero no me funciona. ¿Como podria hacerlo?

Alfabravo
  • 7,352
  • 5
  • 21
  • 31
Maguii Ta
  • 369
  • 3
  • 13

4 Answers4

9

Lo puedes hacer muy simple comparando los tamaños de cada dimension, si en vertical i excede el length de x envias falso, si no compruebas j en el array x[i], si excede envias falso, si no entonces la posición existe:

Actualización: se puede reducir la función en una sola linea y evitar los numeros negativos así:

var x = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

posicionValida = (i,j) => i>=0 && j>=0 && i<x.length && j<x[i].length

console.log(posicionValida(2,2));
console.log(posicionValida(4,1));
console.log(posicionValida(1,5));
console.log(posicionValida(2,-2));

Respuesta anterior:

var x = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];


function posicionValida(i,j){
  if(i>x.length)
    return false;
  if(j>x[i].length)
    return false;
  return true;
}

console.log(posicionValida(2,2));
console.log(posicionValida(4,1));
console.log(posicionValida(1,5));
erika_chan
  • 700
  • 2
  • 11
4

Se puede usar también .hasOwnProperty

var x = [
  [1, 2, 3],
  [4, 0, 6],
  [7, 8, 9]
];

const posicionValida = (i, j) =>
  (x.hasOwnProperty(i) && x[i].hasOwnProperty(j));



console.log(posicionValida(4, 1));
console.log(posicionValida(2, 5));
console.log(posicionValida(1, 1));

.hasOwnProperty() devuelve un booleano indicando si el objeto tiene la propiedad especificada.

Los arrays también son objetos, y los indices serían algunas de las propiedades de ese objeto, como hasOwnProperty no verifica las propiedades heredadas, solo quedarían los índices y .length.

Emeeus
  • 7,104
  • 8
  • 25
2

Antes de responder la pregunta ten en cuenta que

Javascript al hacer una validacion intentara llevarlo a su valor primitivo

Teniendo esto claro solo tienes que validar si x[i] y x[i][j] existe en este orden, como sabes las compuertas logicas siempre valida la segunda si la primera se cumple; y algo adicional! debes de usar la doble negacion !! para llevar el valor a boleano

var x = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 0]
];


function posicionValida(i,j){
  return !!(x[i] && Number.isInteger(x[i][j]) );
}

console.log(posicionValida(2,2));
console.log(posicionValida(4,1));
console.log(posicionValida(1,5));

Complementando la pregunta, JavaScript puede hacer mas operacion llevando los valores a primitvos, por ello te invio a leer

¿Cómo funciona el condicional if (!+[]+!+[] == 2) en JavaScript?

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
1

Esta función debería funcionar siendo pos1 y pos2 de tipo int:

function validarArray(pos1, pos2) {
    let lista = [
        [1, 2, 3],
        [4, 0, 6],
        [7, 8, 9]
    ];
    return lista[0].length > pos1 && lista.length > pos2 && pos1 >= 0 && pos2 >= 0;
}

Devolverá true si la los índices que se le pasa a la función son positivos y son menores que las longitudes (tomada en tamaños, no en índices, de ahí que sea > en vez de >=) respectivas de cada posición, poniendo pos1 como el largo de [1, 2, 3], por ejemplo, y pos2 como el largo de todos los array internos que las componen.

Los demás códigos saltan con un error en caso de meter negativos, en cambio este en su caso devolverá false.

kmevi10
  • 161
  • 1
  • 9