2017-08-30 2 views
1

Je suis en train de trier tableau comme thist (mon état):tableau Tri des objets réducteur Redux

[ 
     { 
      name:"Aenean in justo ante" 
     }, 
     { 
      name:"Phasellus viverra mattis dolor" 
     } 
] 

J'envoie une action au réducteur: (partie du réducteur)

case 'SORT_COLLECTION': 
     return state.sort(function(a, b){ 
    var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase() 
    if (nameA < nameB) 
     return -1 
    if (nameA > nameB) 
     return 1 
     return 0 
}) 

et ça ne marche pas Est-ce que Sombody pourrait me dire où est l'erreur?

+3

Trier va muter le tableau il – MinusFour

+0

Réducteur ** ** ne doit pas muter un état. Il doit retourner un nouvel objet état et laisser le précédent intact. Si vous voulez avoir une option de tri, vous devez ajouter la propriété respective (par exemple spécifier la direction de tri) à votre état et trier les données dans 'render()' en fonction de la valeur de cette propriété. – hindmost

+0

Que voulez-vous dire par "ça ne marche pas". Ce code ne contient aucun bogue évident. –

Répondre

1

La fonction de tri devrait fonctionner correctement. Mais vous ne devriez pas muter l'état d'origine dans le réducteur. Vous pouvez créer une copie du tableau state en appelant le state.slice() avant le tri.

case 'SORT_COLLECTION': 
    return state.slice().sort(function(a, b) { 
    var nameA = a.name.toLowerCase(), 
     nameB = b.name.toLowerCase() 
    if (nameA < nameB) 
     return -1 
    if (nameA > nameB) 
     return 1 
    return 0 
    }) 

Bien sûr, vous pouvez également définir une fonction de tri plus simple.

const state = [{name:'foo'},{name:'bar'},{name:'baz'}] 
 
const sortByKey = key => (a, b) => a[key] > b[key] 
 
const sorted = state.slice().sort(sortByKey('name')) 
 
console.log(`state=${JSON.stringify(state)}\nsorted=${JSON.stringify(sorted)}`)

0

si vous utilisez ES6, vous pouvez essayer comme ça state.sort((a,b) => a.name - b.name);

0

La méthode Array.prototype.sort vous oblige à retourner un integer ou un boolean.

La figure ci-dessous montre comment commander dans les deux sens.

var arr = [ 
 
     { 
 
      name:"Aenean jon justo ante" 
 
     }, 
 
     { 
 
      name:"Aenean in justo ante" 
 
     }, 
 
     { 
 
      name:"Phasellus viverra mattis dolor" 
 
     } 
 
] 
 

 
console.log("Alphabetical:", arr.sort((a,b) => a.name > b.name)); 
 
console.log("Reversed:", arr.sort((a,b) => a.name < b.name));

+0

Avez-vous lu l'article que vous avez lié? 'compareFunction' peut retourner _any number_, pas' true' ou 'false'. – hindmost