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
})
}
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)
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.
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
})