【问题标题】:filtering table by selection : column, condition and value js按选择过滤表:列,条件和值js
【发布时间】:2021-09-23 14:35:15
【问题描述】:

我想通过列,条件和用户输入的值实时过滤表格,我在js中为零,我正在使用django和postgres。表保存在 postgres 中。

模板

<form action="" method="get" class="inline">

        <select name="column" class="form-control">
            <option value="" selected disabled>Choose field</option>
            <option value="title">Title</option>
            <option value="quantity">Quantity</option>
            <option value="distance">Distance</option>
        </select>

        <label for="table">Condition</label>

        <select name="condition" class="form-control">
            <option value="" selected disabled>Choose condition</option>
            <option value="greater">greater</option>
            <option value="contains">contains</option>
            <option value="lower">lower</option>
            <option value="equals">equals</option>
        </select>

        <input class="form-control" type="text" placeholder="search" id="search-text" onkeyup="tableSearch()">

        <button type="submit">Apply</button>
</form>

非常感谢您的帮助)

可以吗?

function myFunction() {
    var input = document.getElementById("myInput");
    var filter = input.value.toUpperCase();
    var table = document.getElementById("myTable");
    var tr = table.getElementsByTagName("tr");
    var tds = tr.getElementsByTagName('td');

    for (var i = 0; i < tr.length; i++) {
        var firstCol = tds[0].textContent.toUpperCase();
        var secondCol = tds[1].textContent.toUpperCase();
        if (firstCol.indexOf(filter) > -1 || secondCol.indexOf(filter) > -1) {
            tr[i].style.display = "";
        } else {
            tr[i].style.display = "none";
        }      
    }
}

【问题讨论】:

    标签: javascript vue.js filter


    【解决方案1】:

    你试过array.filter()方法吗?

    const data = [
      { title: 'spray', quantity: 40, distance: 300 },
      { title: 'pray', quantity: 10, distance: 150 },
      { title: 'grey', quantity: 23, distance: 100 }
    ];
    const result = data.filter(each => each[quantity] < 23 );
    console.log(result);
    // expected output: Array [{ title: 'pray', quantity: 10, distance: 150 }]
    

    您也可以使用eval 并动态更改条件。

    【讨论】:

      【解决方案2】:

      如果您使用的是 vue.js,请尝试以下 sn-p:

      new Vue({
        el: '#demo',
        data() {
          return {
            products: [
              {title: 'pro 1', qty: 7, dist: 234},
              {title: 'apro 1', qty: 3, dist: 456},
              {title: 'cpro 1', qty: 2, dist: 231},
              {title: 'bpro 1', qty: 8, dist: 145},
              {title: 'upro 1', qty: 4, dist: 768},
            ],
            conditions: ['greater', 'contains', 'lower', 'equals'],
            selField: '',
            selCond: '',
            value: '',
            filteredProds: []
          }
        },
        computed: {
          formFields() {
            const fields = []
            for(const key in this.products[0]) {
              let temp = this.products[0][key]
              let type = typeof temp
              fields.push([key, type])
            }
            return fields
          },
        },
        methods: {
          filterProd() {
            if (this.selField !== '' && this.selCond !== '' && this.value !== '') {
              if (this.selField[1] === 'number') {
                this.filteredProds = this.products.filter(p => {
                  if(this.selCond === 'equals') {
                    return p[this.selField[0]] === Number(this.value)
                  } else if(this.selCond === 'greater') {
                    return p[this.selField[0]] > Number(this.value)
                  } else if(this.selCond === 'lower') {
                    return p[this.selField[0]] < Number(this.value)
                  }
                })
              } else {
                this.filteredProds = this.products.filter(p => {
                  if(this.selCond === 'contains') {
                    return p[this.selField[0]].includes(this.value)
                  }
                })
              }
            }
            this.selField = ''
            this.selCond = ''
            this.value = ''
          },
          clearFilters() {
            this.filteredProds = this.products
          }
        },
        mounted() {
          this.filteredProds = this.products
        }
      })
      ul {
        list-style: none;
        width: 300px;
      }
      li, .header {
        display: flex;
        justify-content: space-between;
      }
      .header {
        font-weight: 600;
        background: lightblue;
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
      <div id="demo">
        <form action="" method="get" class="inline">
          <select name="column" class="form-control" v-model="selField">
            <option value="" selected disabled>Choose field</option>
            <option v-for="(field, i) in formFields" :key="i" :value="field">{{ field[0] }}</option>
          </select>
          <label for="table">Condition</label>
          <select name="condition" class="form-control" v-model="selCond">
            <option value="" selected disabled>Choose condition</option>
            <option v-for="(cond, i) in conditions" :key="i">{{ cond }}</option>
          </select>
          <input class="form-control" type="text" placeholder="search" id="search-text" v-model="value">
          <button type="submit" @click.prevent="filterProd">Apply</button>
          <button type="submit" @click.prevent="clearFilters">All</button>
        </form>
        <ul class="header">
          <li v-for="(field, i) in formFields" :key="i">
            {{ field[0] }}
          </li>
        </ul>
        <ul>
          <li v-for="(prod, i) in filteredProds" :key="i">
            <p>{{ prod.title }}</p>
            <p>{{ prod.qty }}</p>
            <p>{{ prod.dist }}</p>
          </li>
        </ul>
      </div>

      【讨论】:

        猜你喜欢
        • 2020-04-09
        • 1970-01-01
        • 2015-08-28
        • 2021-12-19
        • 2019-12-26
        • 2021-09-02
        • 2018-12-30
        • 1970-01-01
        • 2021-09-29
        相关资源
        最近更新 更多