在Redux reducer中对对象数组进行排序

时间:2017-08-30 14:50:14

标签: javascript reactjs sorting redux jsx

我正在尝试像这样排序数组(我的状态):

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

我向reducer发送一个动作:(减速器的一部分)

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

它不起作用 sombody可以告诉我哪里出错了?

4 个答案:

答案 0 :(得分:4)

排序功能应该可以正常工作。但是你不应该在减速器中改变原始状态。您可以在排序之前调用state来创建state.slice()数组的副本。

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

当然,您也可以定义更简单的排序功能。

&#13;
&#13;
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)}`)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

Array.prototype.sort方法要求您返回integerboolean

下面显示了如何在任一方向订购。

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));

答案 2 :(得分:0)

您需要做:

state.slice().sort(...

由于sort()通过对引用进行重新排序(对其进行突变)来更改原始数组,这对于redux存储来说是“不行的”。 slice()首先进行浅表复制,这意味着仅复制引用,并且复制速度很快(除非它包含原语,在这种情况下将对其进行复制,但仍将是快速的),然后将这些新引用移动{{ 1}}。

注意:您仍然不能更改数组中的对象,但是幸运的是排序不会更改它们。

答案 3 :(得分:-1)

如果您使用的是es6,可以尝试这样做 state.sort((a,b) => a.name - b.name);