Vue, результаты дублируются в таблице html

#javascript #vue.js

Вопрос:

Я пытаюсь понять, почему мои результаты дублируются в моем коде vue

В принципе, я просто беру цифры из одного объекта (который показывает количество продуктов, производимых на складе в определенные даты), а затем сравниваю эти результаты с другим объектом (который показывает количество продуктов, которые разрешено производить каждый день).

Я использую цветовое кодирование на основе сравнения, но проблема в том, что я получаю несколько результатов по каждому складу в день, в то время как я должен получать только один на склад, вот так:

 2021-11-13         |      2021-11-14        |  2021-11-15
----------------------------------------------------------------

Warehouse 1: 200       Warehouse 1: 200         Warehouse 1: 200
Warehouse 3: 10000     Warehouse 3: 10000       Warehouse 3: 10000
 

Почему я получаю несколько записей для каждого склада каждый день?

 const warehouseNest = (rows) =>
  rows .reduce(
    (b,row) => {
      
      const warehouseIndex = b [row .warehouse] || (b [row .warehouse] = {dates: {}})

      const date = warehouseIndex .dates [row .date] || (warehouseIndex .dates [row .date] = {qty_for_date: 0})

      date.qty_for_date  = row.qty

      return b
    },
    {}
  );

var vm = 
new Vue({
  el: "#app",
  data: {
    rows:[
        {  
            date: "2021-11-09",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-10",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-11",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-12",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-13",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-14",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-15",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-16",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-17",
            qty: 37,
            warehouse: "1"
        },
        {  
            date: "2021-11-18",
            qty: 37,
            warehouse: "1"
        },
          {  
            date: "2021-11-09",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-10",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-11",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-12",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-13",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-14",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-15",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-16",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-17",
            qty: 37,
            warehouse: "3"
        },
        {  
            date: "2021-11-18",
            qty: 37,
            warehouse: "3"
        }
    ],
    available:[
       {
          "location":"1",
          "date":"2021-11-09",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-10",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-11",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-12",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-13",
          "product_avail":"10000"
       },
       {
          "location":"1",
          "date":"2021-11-14",
          "product_avail":"10000"
       },
       {
          "location":"1",
          "date":"2021-11-15",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-16",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-17",
          "product_avail":"200"
       },
       {
          "location":"1",
          "date":"2021-11-18",
          "product_avail":"200"
       },
       {
          "location":"3",
          "date":"2021-11-09",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-10",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-11",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-12",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-13",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-14",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-15",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-16",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-17",
          "product_avail":"10000"
       },
       {
          "location":"3",
          "date":"2021-11-18",
          "product_avail":"10000"
       }
    ]
  },
  computed: {
    dateNumberData(){
        dateRows = warehouseNest(this.rows)
        return dateRows
    },
   
    dates() {
      return Array.from(Array(11), (_, i) => new Date(Date.now()   i * 86400000).toISOString().slice(0,10))
    },

    activelocation: function() {
      return this.available.filter((location) => {
        if (this.dates.includes(location.date)) {
          return location
        }
      })
    },
  }
  
}); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
<table>
<th v-for="date in dates" :key="date" >   
  <div v-for="(value, location) in dateNumberData" :key="location">   
    <div v-for="(specificValues, dateValue) in value.dates" :key="dateValue">
      <div v-if="dateValue == date ">
        <div v-for="location in activelocation" v-if="dateValue === location.date" :style="'background: '   (specificValues.qty_for_date > location.product_avail ? '#f7a7a3' : '#a8f0c6')">
          <h4 style="display:inline-block; font-weight: bold;">Warehouse {{location.location}}</h4>: {{location.product_avail}}
        </div>
      </div>
    </div>
  </div>
</th>
</table>
</div> 

Ответ №1:

Похоже, вы дважды повторяете все возможные местоположения,

Однажды здесь:

<div v-for="(value, location) in dateNumberData" :key="location">

Затем снова здесь:

<div v-for="location in activelocation" v-if="dateValue === location.date" :style="'background: ' (specificValues.qty_for_date > location.product_avail ? '#f7a7a3' : '#a8f0c6')">

Следовательно, они перечислены дважды.

Вам нужно будет отфильтровать внутреннюю итерацию местоположений по местоположению, которое вы в настоящее время повторяете во внешней.

Например, условие внутреннего цикла теперь включает amp;amp; outerLocation === location.location , и я переименовал outerLocation его, чтобы он не конфликтовал с location внутренним циклом.

 <div v-for="(value, outerLocation) in dateNumberData" :key="outerLocation">   
   <div v-for="(specificValues, dateValue) in value.dates" :key="dateValue">
      <div v-if="dateValue == date ">
        <div v-for="location in activelocation" v-if="dateValue === location.date amp;amp; outerLocation === location.location" :style="'background: '   (specificValues.qty_for_date > location.product_avail ? '#f7a7a3' : '#a8f0c6')">
          <h4 style="display:inline-block; font-weight: bold;">Warehouse {{location.location}}</h4>: {{location.product_avail}}
        </div>
      </div>
   </div>
</div>
 

Я думаю, что это должно решить вашу непосредственную проблему, хотя в принципе сложность этого кода слишком высока, чтобы легко рассуждать об этом, и, вероятно, выиграет от рефакторинга.

Комментарии:

1. Спасибо, это сработало. Это определенно не самая лучшая логика, но это связано с тем, что используются и сравниваются два разных источника данных, пока мы не соберем их в одном источнике