迭代VueJs中的数组

问题描述 投票:0回答:1

我需要帮助迭代Vue中的数组。

数据结构 - 来自数据库 - 是一个蔬菜列表,每个案例根据其属和通用名称以及特定于该属的ID进行识别。

[{"genus":"Allium","name":"Garlic","id":19},
{"genus":"Allium","name":"Leek","id":19},
{"genus":"Allium","name":"Onions","id":19},
{"genus":"Allium","name":"Shallot","id":19},
{"genus":"Allium","name":"Spring onions","id":19},
{"genus":"Brassica","name":"Broccoli","id":20},
{"genus":"Brassica","name":"Cabbage","id":20},
{"genus":"Brassica","name":"Cauliflower","id":20},
{"genus":"Brassica","name":"Kale","id":20},
{"genus":"Cucurbit","name":"Bittermelon","id":13},
{"genus":"Cucurbit","name":"Cucumber","id":13},
{"genus":"Cucurbit","name":"Pumpkin","id":13},
{"genus":"Cucurbit","name":"Rockmelon","id":13},
{"genus":"Cucurbit","name":"Squash","id":13},
{"genus":"Cucurbit","name":"Zucchini","id":13},
{"genus":"Legume","name":"Beans","id":8},
{"genus":"Legume","name":"Broad beans","id":8},
{"genus":"Legume","name":"Peas","id":8}]

我在数据中识别出唯一的属性值(参见下面的“uniqueGenera”),然后遍历属于该属的所有蔬菜并显示其名称。

我有两个问题。

首先,一旦我确定了唯一的属名,我似乎无法访问与该属相关的ID(在“navigateTo(item.id)中)

<v-card
        v-for="(item,i) in uniqueGenera(genus)"
        :key="i"
        ripple
        @click="navigateTo(item.id)" class="hand"
    >
        <v-layout fill-height>
            <v-flex xs12 align-end flexbox>
                <p v-text="item"></p>
                <span
                    v-for="(card, index) in cards"
                    v-if = "card.genus === item"
                    >
                    {{card.name + ', '}}
                </span>
            </v-flex>
        </v-layout>
    </v-card>

其次,我想将每个属中的蔬菜名称显示为以逗号分隔的列表,但是当我们到达任何给定属的当前数组的最后一项时,我不知道如何计算,以便停止逗号被添加到该姓氏。

我正在确定如下独特的属:

uniqueGenera: function () {
  var vm = this;
  return function (keyname) {
    var output = [];
    var keys = [];

    vm.cards.forEach(function (card) {
      var key = card[keyname];

      if (keys.indexOf(key) === -1) {
        keys.push(key);
        output.push(card[keyname]);
      }
    });
    return output;
  };
},
vue.js
1个回答
1
投票

听起来您可以从将数据映射到更有用的格式的计算属性中受益。例如,生产类似的东西

{
  "19": {
    name: "Allium",
    vegetables: ["Garlic", "Leek", "Onions", "Shallot", "Spring onions"]
  },
  "20": {
    name: "Brassica",
    vegetables: [...]
  },
  ...
}

就像是

computed: {
  genera () {
    return this.cards.reduce((genera, item) => {
      if (!Object.prototype.hasOwnProperty.call(genera, item.id)) {
        genera[item.id] = { id: item.id, name: item.genus, vegetables: [] }
      }
      genera[item.id].vegetables.push(item.name)
      return genera
    }, Object.create(null))
  }
}

现在您可以更轻松地迭代您的数据。例如

<v-card v-for="(genus, id) in genera" :key="id" ripple class="hand"
        @click="navigateTo(id)">
  <v-layout fill-height>
    <v-flex xs12 align-end flexbox>
      <p>{{ genus.name }}</p>
      <span>{{ genus.vegetables.join(', ') }}</span>
    </v-flex>
  </v-layout>
</v-card>
© www.soinside.com 2019 - 2024. All rights reserved.