67 votes

Couper un tableau en deux, peu importe sa taille?

Je dispose d'un tableau que je voudrais diviser en deux. Ainsi, je peux positionner la première moitié du côté droit et la deuxième moitié du côté gauche.

J'ai déjà utilisé la fonction splice :

var leftSide = arrayName.splice(0,2);

Mais je ne suis pas sûr comment le diviser en deux peu importe sa taille, car le tableau changera de taille dynamiquement.

2 votes

Comment pourriez-vous déterminer la taille de chaque moitié que vous voulez ?

3 votes

-1 parce que vous pouvez le déterminer juste en y réfléchissant. Quel sera le point médian - l'argument de splice - lorsque la taille du tableau est de N? Et comment déterminez-vous N?

1 votes

Que se passe-t-il s'il y a un nombre impair? Il n'y a pas de 'Moitié'.... juste en train de dire!

89voto

redmoon7777 Points 2283
var half_length = Math.ceil(arrayName.length / 2);    

var leftSide = arrayName.slice(0,half_length);

code édité suivant les commentaires de @Lightness Races in Orbit et @pubkey.

2 votes

Math.ceil(arrayName.length / 2) peut remplacer sept et un tiers de lignes de votre code, et éviter de contaminer la portée globale en prime.

1 votes

C'est dangereux car cela mute le tableau original 'arrayName'. Vous pouvez éviter cela en appelant d'abord slice(0) pour copier le tableau original comme arrayName.slice(0).splice(0, halfLength);

78voto

Joe Lloyd Points 3828

Évitez les mutations

Si vous devez éviter les mutations, par exemple si vous devez diviser un tableau en réaction, vous ne voulez pas muter l'original car cela pourrait entraîner un comportement très étrange dans votre application.

Qu'est-ce qu'une mutation?

Une mutation est lorsque vous changez un non-primitif, comme un objet ou un tableau. Utiliser une méthode de tableau comme splice modifiera le tableau d'origine. Vous pouvez toujours dire si une méthode mutera en fonction du fait qu'elle retourne ou non un nouvel tableau ou un nouvel objet.

Pourquoi les mutations peuvent-elles être "mauvaises"?

Lorsque vous mutez un objet ou un tableau, vous modifiez cette référence d'origine. Cela signifie que si vous utilisez la référence d'origine, vous obtiendrez la nouvelle valeur. Cela est mieux illustré par un exemple.

// faire un nouvel objet
const myObj = { key: "une valeur" };

// attribuer un nouvel objet constant à l'objet (cela est attribué par référence)
const newObj = myObj;

// changer la valeur d'une clé dans la nouvelle constante
newObj.key = "une autre valeur";

// enregistrer l'objet d'origine et voir que sa valeur a été modifiée
console.log(myObj) // affichera { key: "une autre valeur" };

Comme vous pouvez le voir, l'objet myObj a également eu la valeur de la clé modifiée. Choses effrayantes.

Utilisez Slice

Vous pouvez contourner cela en utilisant slice au lieu de splice

Exemple

let votreTableau = props.someArray;
let milieu = Math.floor(votreTableau.length / 2)
// ou au lieu du plancher, vous pouvez utiliser le plafond en fonction de quel côté obtient les données supplémentaires

let premierDemiTableau = votreTableau.slice(0, milieu);
let deuxiemeDemiTableau = votreTableau.slice(milieu, votreTableau.length);

23voto

jfriend00 Points 152127

Vous pouvez simplement vous référer à la longueur du tableau :

var leftSide = arrayName.splice(0, Math.floor(arrayName.length / 2));

Étant donné que .splice() retire effectivement des éléments du tableau source, les éléments restants dans le tableau seront les éléments pour la moitié droite.

Math.floor() arrondira vers le bas pour donner un élément de moins que le côté droit pour les longueurs impaires. Vous pourriez utiliser Math.ceil() si vous voulez arrondir vers le haut pour donner un élément de plus que le côté droit lorsque la longueur est impaire.

6voto

Yi-Ting Liu Points 737

Jetez un oeil à lodash chunk:

var myArray = [1, 2, 3, 4, 5, 6, 7, 8];
var pivot = _.ceil(myArray.length / 2);
// => 4
console.log(_.chunk(myArray, pivot));

6voto

Pradeep Maurya Points 31

Vous pouvez également utiliser la destructuration ES6 et slice() afin que le tableau original ne soit pas modifié.

   const votreTableau;
   let coteGauche, coteDroit;
   const m = Math.floor(votreTableau.length/2);
   const [coteGauche, coteDroit] = [votreTableau.slice(0,m), votreTableau.slice(m,votreTableau.length)];
   console.log(coteGauche);
   console.log(coteDroit);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X