Сортировка массива в Vue.js
Как я могу отсортировать массив по имени или полу, прежде чем отображать его в цикле v-for?
https://jsfiddle.net/rg50h7hx/
<div id="string">
<ul>
<li v-for="array in arrays">{{ array.name }}</li>
</ul>
</div>
// Vue.js v. 2.1.8
var string = new Vue({
el: '#string',
data: {
arrays: [
{ name: 'kano', sex: 'man' },
{ name: 'striker', sex: 'man' },
{ name: 'sonya', sex: 'woman' },
{ name: 'sindell', sex: 'woman' },
{ name: 'subzero', sex: 'man' }
]
}
})
Нужно ли использовать "вычисленный" или что-то еще?
Ответы
Ответ 1
Да, простой способ сделать это можно создать вычисляемое свойство, которое может вернуть sortedArray, например:
computed: {
sortedArray: function() {
function compare(a, b) {
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
return this.arrays.sort(compare);
}
}
См. рабочую демонстрацию.
Вы можете найти документацию сортировки здесь, в которой используется функция compareFunction.
compareFunction Задает функцию, которая определяет порядок сортировки. Если опустить, массив сортируется в соответствии с каждым символьным значением кодовой точки символа Unicode в соответствии с преобразованием строки каждого элемента.
Ответ 2
с функциями стрелки es6:
sortedArray(){
return this.arrays.sort((a, b) => a.name - b.name );
}
Ответ 3
HTML сторона
<div id="string">
<ul>
<li v-for="array in sortArrays(arrays)">{{ array.name }}</li>
</ul>
</div>
Vue JS код || Использование Lodash
var string = new Vue({
el: '#string',
data: {
arrays: [
{ name: 'kano', sex: 'man' },
{ name: 'striker', sex: 'man' },
{ name: 'sonya', sex: 'woman' },
{ name: 'sindell', sex: 'woman' },
{ name: 'subzero', sex: 'man' }
]
},
methods: {
sortArrays(arrays) {
return _.orderBy(arrays, 'name', 'asc');
}
}
})
- в функции orderBy первым аргументом является массив, вторым аргументом является ключ (имя/пол), третьим аргументом является порядок (asc/desc)
Ответ 4
Простой способ; Вы можете использовать computedArray вместо массива
computed: {
computedFonksiyon() {
this.arrays.sort(function(x, y) {
return y.name- x.name;
});
return this.arrays;
}
}
Ответ 5
Это работает действительно круто:
sortFunc: function (){
return this.arrays.slice().sort(function(a, b){
return (a.name > b.name) ? 1 : -1;
});
}
вызвать функцию из HTML:
<div id="string">
<ul>
<li v-for="array in sortFunc()">{{ array.name }}</li>
</ul>
</div>