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/
3 Réponses :
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);
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.
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);
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>
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 :)