Mi tarea es dividir la matriz dada en matrices más pequeñas usando JavaScript. Por ejemplo, [1, 2, 3, 4] se debe dividir en [1] [1, 2] [1, 2, 3] [1, 2, 3, 4] [2] [2, 3] [2, 3, 4] [3] [3, 4] [4].

Estoy usando este código:

let arr = [1, 2, 3, 4];

for (let i = 1; i <= arr.length; i++) {
  let a = [];
  for (let j = 0; j < arr.length; j++) {
    a.push(arr[j]);
    if (a.length === i) {
      break;
    }
  }
  console.log(a);
}

Y obtengo el siguiente resultado: [1] [1, 2] [1, 2, 3] [1, 2, 3, 4] undefined

¿Qué me estoy perdiendo / haciendo mal?

18
IntoTheDeep 17 sep. 2018 a las 11:10

6 respuestas

La mejor respuesta

Tiene dos problemas en su código:

  1. Debe tener un bucle para inicializar con el valor de i para el bucle interno para que considere el siguiente índice para la nueva iteración de i
  2. Debe eliminar ese break en la longitud que tiene en el bucle interno.
let arr = [1, 2, 3, 4];
for (let i = 0; i <= arr.length; i++) {
  let a = [];
  for (let j = i; j < arr.length; j++) {
    a.push(arr[j]);
    console.log(a);
  }
}
11
Ankit Agarwal 17 sep. 2018 a las 08:22

Para la matriz interna, puede comenzar con el índice de la matriz externa.

var array = [1, 2, 3, 4],
    i, j, l = array.length,
    result = [];
    
for (i = 0; i < l; i++) {
    for (j = i; j < l; j++) {
        result.push(array.slice(i, j + 1));
    }
}
console.log(result.map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }
16
Nina Scholz 17 sep. 2018 a las 20:58

Si no quieres mutar tu matriz.

    let arr = [1, 2, 3, 4];
    let res = [];
    for (let i = 0; i <= arr.length; i++) {
      let a = [];
      for (let j = i; j < arr.length; j++) {
        a = [...a, arr[j]];
        res = [...res, a];
      }
    }
 console.log(res);
0
Yanis-git 17 sep. 2018 a las 09:48

Prueba esto

 let arr = [1, 2, 3, 4];
       for (let i = 0; i <= arr.length; i++) {
          let a = [];
          for (let j = i; j < arr.length; j++) {
            a.push(arr[j]);    
              console.log(a);            
          }  
        }
2
Alexandr Kudryashov 18 sep. 2018 a las 08:30

Usa dos iteraciones

  1. obtener una matriz de corte basada en el índice de bucle.
  2. use una matriz en rodajas y combine el elemento de matriz.
  var arr = [1, 2, 3, 4];
  let newArra =[];
  arr.map((x,i)=> {
       let remainArr = arr.slice(i);
       return remainArr.forEach((y, r) => newArra.push(remainArr.slice(0, r+1)))
  })
  newArra.forEach(x=> console.log(x))
0
Anoop 17 sep. 2018 a las 12:05

He preparado stackblitz para este caso.

let source = [1,2,3,4];
const output = [];
const arrayMultiplier = (source) => {
  const eachValueArray = [];
  source.forEach((item, index) => {
    // Will push new array who will be sliced source array.
    eachValueArray.push(source.slice(0, source.length - index));
  });
  //We reverse array to have right order.
  return eachValueArray.reverse();
};

for(let i = 0; i <= source.length; i++) {
  output.push(...arrayMultiplier(source));
  source.shift();  // Will recraft source array by removing first index.
}
//Don't forget last item.
output.push(source);
console.log(output);

No es la solución más corta pero hace el trabajo

== actualizar después de la revisión del código ==

// [...]
const arrayMultiplier = (source) => {
    // Will push new array who will be sliced source array.
    // We reverse array to have right order.
  return source.map((item, index) => source.slice(0, source.length - index)).reverse();
};
// [...]
0
Yanis-git 17 sep. 2018 a las 10:56