1
votes

Manipuler un tableau multidimensionnel en javascript

Faire fonctionner la dernière partie de ma manipulation de tableaux me rend fou. Essentiellement, j'ai:

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
]

array2 = []
console.table(array1)

//--------

array1.forEach(e => {
  for (var counter = 0; counter < e[0]; counter++) {
    array2.push(e);
  }
});

console.table(array2);

//--------


var myCol2 = 1007
var mycounter = 0

array2.forEach(e => {

  if (e[1] == myCol2) {
    mycounter = mycounter + 1
    var myinteger = parseInt(e[1]) + mycounter // convert ref. to number
    myinteger = myinteger.toString(); // convert ref. back to string

    e[1] = myinteger
    myCol2 = e[1]
  }
  else
  {
    myCol2 = e[1]
    mycounter = 0
  }

});

console.table(array2);

et je veux ceci ...

var array2 = [
  ["2", "1007", "1008"],
  ["5", "1042", "1043", "1044", "1045", "1046"],
  ["3", "1076", "1077", "1078"],
]

En d'autres termes, je veux utiliser le premier élément de chaque sous-groupe comme compteur pour générer des ajouts consécutifs au deuxième élément. C'est la dernière partie sur laquelle je suis coincé et je ne vois pas pourquoi mon code ne fonctionne pas. Le violon décompose l'opération en parties simples. Ce sera pour environ 12 000 lignes, donc j'imagine que mon approche actuelle avec plusieurs boucles «forEach» n'est pas la plus rapide. Toute idée sur de meilleures performances (tout en restant lisible s'il vous plaît) serait la bienvenue.

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
]

Fiddle: https://jsfiddle.net/u2fwy6hc/


1 commentaires

array1.map (([n, s]) => [n, ... Array (+ n) .fill (). map ((_, i) => `$ {+ s + i}` )]); mais notez que cela ne remplira pas votre exigence de "plus rapide", c'est juste une façon amusante :)


3 Réponses :


3
votes

Au lieu d'utiliser .forEach () , vous pouvez utiliser .map () pour convertir chaque tableau interne en une version "étendue" de lui-même basée sur la première valeur fourni dans votre tableau interne comme ceci:

const arr = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
];

const res = arr.map(([r, start]) => { // use destructuring to get the first and second element of your inner array
  const ret = []; // create a temp array to hold our "consecutive" integers
  for(let i = +start; i<+start + +r; i++) // create a loop, to loop through our number range (where `i` represents a given number in the range
    ret.push(''+i); // add the number to the temp array (as a string ''+)
  return [r, ret]; // return he new array to take the place of the inner array
});

console.log(res);


1 commentaires

C'est génial et expliqué assez clairement pour que je puisse comprendre. «Convertir chaque tableau interne en une version« étendue »de lui-même» est exactement ce sur quoi j'étais coincé. Votre aide est très appréciée.



0
votes

Vous pouvez parcourir le tableau et prendre le tableau interne et le remplir jusqu'à ce que le nombre voulu soit atteint.

function fill(array) {
    for (let a of array) {
        let [i, v] = a;
        while (--i) a.push((++v).toString());
    }
}

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
];

fill(array1);

console.log(array1);


0 commentaires

2
votes

Pour une version plus compacte, vous pouvez utiliser Array.reduce () et un peu de diffusion ES6:

var arr2 = array1.map(([count, start])=> [count, ...[...Array(+count).keys()].map(val=>`${+start + +val}`)])

Ce qui peut même être fait en une seule ligne :

var arr2 = array1.reduce((acc, [count, start])=> [...acc, [`${count}`,...[...Array(+count).keys()].map(val=>`${+start+val}`)]]
,[])

Edit: sur réflexion, Array.map () est supérieur:

const arr2 = array1.reduce((acc,[count,start])=>{
   const vals = [...Array(+count).keys()].map(val=>`${+start+val}`)
   return [...acc, [`${count}`,...vals]]
 },[])

p>


0 commentaires