web-dev-qa-db-fra.com

Erreur lors du tri du tableau d'objets Impossible d'attribuer à la propriété en lecture seule '2' de l'objet '[tableau d'objets]'

J'ai un tableau d'objets où l'objet ressemble à ceci (les valeurs changent):

   {
     stats: {
        hp: 2,
        mp: 0,
        defence: 4,
        agility: 11,
        speed: 6,
        strength: 31
     }
   }

Je veux les trier par ordre décroissant par vitesse en faisant:

  array.sort((a, b) => {
            return b.stats.speed - a.stats.speed
        })

Cependant, je reçois cette erreur et je ne peux pas vraiment déchiffrer ce qui se passe:

TypeError: impossible d'attribuer à la propriété en lecture seule '2' de l'objet '[tableau d'objets]'

Qu'est-ce que je rate?

Edit: tableau d'objets dans le magasin redux:

const enemyDefaultState = [
{
    name: 'European Boy1',
    stats: {
        hp: 2,
        mp: 0,
        defence: 4,
        agility: 11,
        speed: 6,
        strength: 31
    }
},
{
    name: 'European Boy2',
    stats: {
        hp: 2,
        mp: 0,
        defence: 4,
        agility: 4,
        speed: 2,
        strength: 31
    }
},
{
    name: 'European Boy3',
    stats: {
        hp: 2,
        mp: 0,
        defence: 4,
        agility: 7,
        speed: 7,
        strength: 31
    }
},

]

J'importe le tableau et l'affecte à la variable:

 let enemies = getState().enemy;
        if (enemies) {
            //sort by speed stat
            enemies.sort((a, b) => {
                return b.stats.speed - a.stats.speed
            })
        }
10
MazMat

Parce que le tableau est figé dans mode strict , vous devrez copier le tableau avant de le trier:

array = array.slice().sort((a, b) => b.stats.speed - a.stats.speed)
29
Patrick Roberts

La raison, comme l'a déclaré Patrick, est que le tableau est figé. Donc, toute méthode de copie du tableau fonctionnera comme celle qu'il suggère.

array = array.slice().sort((a, b) => b.stats.speed - a.stats.speed)

Je veux juste ajouter que le raison le tableau est figé dans votre cas parce que vous utilisez le tableau comme accessoires du magasin redux et les accessoires dans React sont immuables donc vous ne pouvez pas muter le tableau.

3
Nick Friedman

Le tableau est gelé pour empêcher la mutation de l'état redux. Vous utilisez react cloneElement (): https://reactjs.org/docs/react-api.html#cloneelement

[...enemies].sort((a, b) => {
                return b.stats.speed - a.stats.speed
            })
0
slash