Я пытаюсь отсортировать массив следующим образом (мое состояние):

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

Я отправляю действие на редуктор: (часть редуктора)

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

Но это не работает Может кто-нибудь сказать мне, где ошибка?

5
Mac 30 Авг 2017 в 17:50

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

Конечно, вы также можете определить более простую функцию сортировки.

const state = [{name:'foo'},{name:'bar'},{name:'baz'}]
const sortByKey = key => (a, b) => a[key] > b[key] ? 1 : -1
const sorted = state.slice().sort(sortByKey('name'))
console.log(`state=${JSON.stringify(state)}\nsorted=${JSON.stringify(sorted)}`)
6
rmcsharry 1 Окт 2019 в 14:46

Если вы используете es6, вы можете попробовать вот так {{Х0}}

-1
LowCool 30 Авг 2017 в 15:02

Array.prototype.sort требует метод вернуть integer или boolean.

Ниже показано, как сделать заказ в любом направлении.

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
Purgatory 30 Авг 2017 в 15:23

Вам нужно сделать:

state.slice().sort(...

Поскольку sort() изменяет исходный массив, переупорядочивая ссылки (изменяет его), что является "не ходом" для избыточного хранилища. slice() сначала выполняет поверхностное копирование, то есть копируются только ссылки, и это быстро (если только оно не содержит примитивов, в этом случае они будут скопированы, но все равно будет быстрым), а затем эти новые ссылки перемещаются {{ X2 } } .

ПРИМЕЧАНИЕ: вы все еще не можете изменить объекты в массиве, но, к счастью, сортировка не меняет их.

0
Orhan 3 Фев 2019 в 11:58