Как сделать v-for итерацию в определенном порядке?

1

У меня есть и массив объектов, элементы которых упорядочены произвольно. Я хотел бы перечислить значения в определенном порядке (ключей).

Например, приведенная ниже итерация перечисляет их:

var vm = new Vue({
  el: "#root",
  data: {
    all: [{
        second: 2,
        third: 3,
        first: 1
      },
      {
        third: 30,
        first: 10,
        second: 20
      }
    ],
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.js"></script>
<div id="root">
  <div v-for="a in all">
    <div v-for="(v, k) in a">{{v}}</div>
  </div>
</div>

Можно ли управлять итерацией так, чтобы она упорядочивалась в соответствии со списком ключей (["first", "second", third"]), которая давала бы

1
2
3
10
20
30
Теги:
vue.js

4 ответа

1
Лучший ответ

Вы можете поместить список отсортированных ключей в массив и v-for вместо этого.

<div v-for="a in all">
  <div v-for="key in presortedListOfKeys">
    {{a[key]}}
  </div>
</div>
3

Я не знаю vue, но вы можете сделать это в javascript.

<div v-for="k in Object.keys(a).sort()">{{k}}:{{a[k]}}</div>

Также обратите внимание, что сортировка по алфавиту случайно вписывается в вашу потребность, но вам может понадобиться пользовательская функция sort((a,b)=>order.indexOf(a)-order.indexOf(b)) такая как sort((a,b)=>order.indexOf(a)-order.indexOf(b)) с вашим пользовательским order: ["first","second","third","fourth"] который не может быть буквенным.

var vm = new Vue({
  el: "#root",
  data: {
    all: [{
        second: 2,
        third: 3,
        first: 1,
        fourth: 4
      },
      {
        third: 30,
        first: 10,
        second: 20,
        fourth: 40
      }
    ],
    order: ["first","second","third","fourth"]
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.js"></script>
<div id="root">
  <div v-for="a in all">
    <div v-for="k in Object.keys(a).sort((a,b)=>order.indexOf(a)-order.indexOf(b))">{{k}}:{{a[k]}}</div>
    <hr/>
  </div>
</div>
0

Вы можете использовать вычисляемые свойства и получить all отсортированные сначала перед итерацией через них.

0

В модуле 5 моего учебного курса Vue.js я на самом деле обсуждаю это. На первый взгляд подход Object.keys может показаться правильным подходом. Однако разные JavaScript-движки возвращают свойства в разных порядках. По этой причине вы не можете положиться на это.

В Vue.js вы можете либо a) сортировать свой массив при заполнении массива. B) создать "вычисленное свойство" или c) создать метод сортировки, в который вы можете передать свое свойство.

На мой взгляд, вы должны использовать опцию b. Причина в том, что вычисленные свойства получают кеширование. Делая это, вы только запускаете свой код сортировки один раз. Однако, если бы вы использовали опцию c, сортировка выполнялась бы во время каждой итерации. Вариант a - возможность, но я не знаю достаточно о вашем сценарии, чтобы узнать, является ли это реальным вариантом или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню