#javascript #vue.js #sorting #methods #filter
#javascript #vue.js #сортировка #методы #Фильтр
Вопрос:
Я просматриваю массив в моем приложении VUE, который имеет следующую структуру
[
{
"id": 1,
"brands": [
{
"name": "Mall",
"id": 1
},
{
"name": "Tanted",
"id": 25
},
{
"name": "Anteil",
"id": 12
},
{
"name": "Moscard",
"id": 73
}
]
},
{
"id": 2,
"brands": [
{
"name": "Yanre",
"id": 6
},
{
"name": "Alted",
"id": 10
},
{
"name": "Sillex",
"id": 9
},
{
"name": "Straf",
"id": 78
}
]
}
]
первое, что я делаю, чтобы показать различные параметры выбора, где я их показываю, — это фильтр по идентификатору
computed: {
filteredBrand() {
var selectedBrand =
!this.businessInfo || this.businessInfo.selectedBrand == 0
? 1
: this.businessInfo.selectedBrand;
return !this.$store.getters.brands
? null
: this.$store.getters.brands.filter(
item => item.id == selectedBrand
)[0].brands;
}
}
<select
v-model="businessInfo.selectedBrand"
@change="onChangeBrand($event)">
<option v-for="brand in filteredBrand" v-bind:key="brand.name">{{ brand.name }}</option>
</select>
до этого момента мне удавалось показывать бренды, соответствующие каждому идентификатору в списке выбора, но я хотел отсортировать их также в алфавитном порядке, и я не могу найти способ объединить фильтр с сортировкой.
Я попытался объединить методы, но это возвращает синтаксическую ошибку.
computed: {
filteredBrand() {
var selectedBrand =
!this.businessInfo || this.businessInfo.selectedBrand == 0
? 1
: this.businessInfo.selectedBrand;
return !this.$store.getters.brands
? null
: this.$store.getters.brands.filter(
item => item.id == selectedBrand
)[0].brands.sort(function(a, b) {
return a.name === b.name ? 0 : (a.name > b.name) || -1;
});
}
}
Как я могу это сделать?
Заранее спасибо всем за ваше время и помощь
Комментарии:
1. «но это возвращает синтаксическую ошибку» Пожалуйста, всегда включайте копию и вставку фактического полного сообщения об ошибке и сообщайте нам, на какую строку оно жалуется. Я не вижу никакой синтаксической ошибки в
sort
коде, который вы показали. (Я бы не стал использовать этот код, но я не вижу в нем синтаксической ошибки.)
Ответ №1:
Чтобы сравнить две строки лексикографически (свободно, в алфавитном порядке) в порядке возрастания (от А до Я), вы делаете это в обратном sort
вызове:
return a.name.localeCompare(b.name);
Для порядка убывания (Z-A) используйте
return b.name.localeCompare(a.name);
Примечание: каждый раз, когда вы обнаруживаете, что пишете array.filter(/*...*/)[0]
, пишите array.find(/*...*/)
вместо этого. (Полизаполнение find
, если вам нужна поддержка IE.) find
Метод останавливается, когда находит первую совпадающую запись и возвращает эту запись, вместо того, чтобы перебирать весь массив, создавая новый массив из всех совпадающих записей. Вам не нужно просматривать весь массив и создавать новый, если вы просто собираетесь захватить первую запись. 🙂
Итак, объединив это с основным ответом выше:
return !this.$store.getters.brands
? null
: this.$store.getters.brands.find(
item => item.id == selectedBrand
).brands.sort((a, b) => a.name.localeCompare(b.name));
Комментарии:
1. Большое вам спасибо за ответ и за прекрасное объяснение. Понял, и я надеюсь, что больше не повторю ту же ошибку! Хорошего дня
2. просто комментарий, т.Е. Ошибка при рендеринге: «TypeError: объект не поддерживает свойство или метод ‘find'»
3. @javascript110899 — Если вам нужна поддержка IE, вам потребуется полизаполнение
Array.prototype.find
, см. Связанную страницу MDN.4. Я только что добавил следующий скрипт, чтобы он работал во всех браузерах Спасибо