web-dev-qa-db-fra.com

Comment obtenir toutes les sous-chaînes (sous-séquences contiguës) de mon tableau JavaScript?

Ma tâche est de scinder le tableau donné en tableaux plus petits en utilisant JavaScript. Par exemple, [1, 2, 3, 4] doit être divisé en [1] [1, 2] [1, 2, 3] [1, 2, 3, 4] [2] [2, 3] [2, 3, 4] [3] [3, 4] [4].

J'utilise ce code:

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);
}

Et j'obtiens le résultat suivant: [1] [1, 2] [1, 2, 3] [1, 2, 3, 4] undefined

Qu'est-ce qui me manque/je fais mal?

17
TeodorKolev

Vous avez deux problèmes dans votre code:

  1. Vous devez avoir une boucle pour initialiser avec la valeur i pour la boucle interne afin qu'elle considère le prochain index pour la nouvelle itération de i
  2. Vous devez supprimer cette break sur la longueur que vous avez en boucle interne.

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

Pour le tableau interne, vous pouvez simplement commencer par l'index du tableau externe.

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

Essaye ça 

 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

Utilisez deux itérations

  1. obtenir un tableau de tranches basé sur l'index de la boucle.
  2. utiliser un tableau en tranches et combiner un élément de tableau.

  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
    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
Varun Arya

j'ai préparer stackblitz pour ce cas.

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);

N'est-ce pas la solution la plus courte mais fait le travail

== mise à jour après révision du code ==

// [...]
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