Я пытаюсь отсортировать массив следующим образом (мое состояние):
[
{
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
})
Но это не работает Может кто-нибудь сказать мне, где ошибка?
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)}`)
Если вы используете es6, вы можете попробовать вот так {{Х0}}
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));
Вам необходимо сделать:
state.slice().sort(...
Поскольку sort()
изменяет исходный массив, переупорядочивая ссылки (изменяет его), что является "не ходом" для избыточного хранилища. slice()
сначала выполняет поверхностное копирование, то есть копируются только ссылки, и это быстро (если только оно не содержит примитивов, в этом случае они будут скопированы, но все равно будет быстрым), а затем эти новые ссылки перемещаются {{ X2 } } .
ПРИМЕЧАНИЕ: вы все еще не можете изменить объекты в массиве, но, к счастью, сортировка не меняет их.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.