J'essaie de faire pivoter un tableau à partir de la position centrale. Dites par exemple:
Pour un tableau [1,2,3,4,5] si je sélectionne 5 comme élément actuel, le nouveau tableau doit être [3,4,5,1,2] . Si je sélectionne 4 , cela devrait être [2,3,4,5,1
J'ai essayé le code ci-dessous et cela fonctionne pour certains étendue mais il positionne le sélectionné au début au lieu du centre.
Toute aide à l'approche sera vraiment appréciée
var arr = [0,1,2,3,4];
function rot(arr, ind)
{
var narr = [];
var len = arr.length;
for(var i=0; i<arr.length; i++)
{
narr.push((i+ind<len?arr[i+ind]:arr[len-i-1]));
}
return narr;
}
console.log(rot(arr,0))
3 Réponses :
Premièrement, trouvez dans quelle mesure vous allez faire pivoter le tableau ( delta ), puis vous épissez autant d'éléments que sa magnitude à partir de l'avant si elle est négative ou de l'arrière si elle est positive.
Placez les éléments épissés à l'extrémité opposée.
function rot(arr, center) {
const index = arr.indexOf(center)
if (index === -1) {
throw new Error('')
}
if (arr.length % 2 === 0) {
throw new Error('')
}
const cIndex = Math.floor(arr.length/2)
const delta = cIndex - index
let narr = [...arr]
if (delta > 0) {
let temp = narr.splice(-delta)
narr = [...temp, ...narr]
}
else if (delta < 0) {
let temp = narr.splice(0, -delta)
narr = [...narr, ...temp]
}
return narr
}
let arr = [1,2,3,4,5]
console.log(rot(arr, 1))
console.log(rot(arr, 2))
console.log(rot(arr, 3))
console.log(rot(arr, 4))
console.log(rot(arr, 5))
c'est fondamentalement la même chose que ce que @Mohammad a publié, mais au lieu d'utiliser ind comme index, vous utilisez arr.indexOf (ind) pour obtenir l'index pertinent.
J'ajouterais aussi quelque chose pour traiter le si vous ne trouvez pas la valeur ...
let arrr = [1,2,3,4,5];
function rot(arr, ind) {
let narr = [...arr]; //copy and de-reference our array
let indexFound = narr.indexOf(ind); //find out where ind is
if(indexFound < 0 ) return narr; //ind was not found in your array
let len = Math.floor((narr.length/2) - indexFound); //find out how far your target is from the center
let doShift = (len < 0); //if len is negative, then we need elements from the beginning moved, otherwise move the elements off the end with pop()
len = Math.abs(len); //make sure len is always positive so our loop can run
for(var i=0; i<len; i++) {
if(doShift) narr.push(narr.shift());
else narr.unshift(narr.pop());
}
return narr;
}
console.log(rot(arrr,3));
console.log(rot(arrr,1));
console.log(rot(arrr,5));
Modifier: modifié pour gérer le décalage depuis la fin ou le début
Essayez
let arr=[1,2,3,4,5]; let rot=(a,v,i=a.indexOf(v))=>a.map((x,j)=>a[(i+1+j+a.length/2)%a.length|0]); console.log( rot(arr,4) ); console.log( rot(arr,5) );
où n | 0 transforme le flottant en entier. Nous utilisons la fonction de flèche , indexOf et carte
let rot= (a,v,i=a.indexOf(v)) => a.map((x,j)=> a[(i+1+j+a.length/2)%a.length|0])
Ne devrait-il pas être a.map (/ * ... * /) au lieu de arr.map (/ * ... * /) ?
Pourquoi
2apparaît deux fois dans la deuxième sortie?Que faire s'il y a un nombre pair d'éléments dans le tableau?
Le deuxième argument est index ou valeur?
@VDWWD mon exigence est uniquement pour un nombre impair d'articles
@NathanXabedi c'est la valeur