2017-02-21 2 views
0

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

Я строю таблицу, которая позволяет пользователю иметь фильтры для столбцов (в этом случае простые input s). Столбцы являются динамическими, поэтому количество данных (тысячи строк, но менее 100 000 записей).

// example data 
var columns = ['id', 'title', 'date', 'colour'] 
var data = [{ id: 1, title: 'Testentry 1', date: '2017-02-21T07:10:55.124Z', colour: 'green'}] 

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

Поисковые запросы хранятся в объекте search, а отфильтрованные данные - это вычисленное свойство, которое обновляется при изменении search. Способ, которым это работает, заключается в том, что если я изменил поисковый запрос на title, он переоценил бы поисковый запрос даже для ID, хотя поисковый запрос для этого не изменился.

Для этого потребуется кэширование данных для каждого столбца. И нужно только проверять колонтитулы.

изменения: добавлен код для фильтрации:

filteredRows() { 
    var rows = this.data 
    for (var i = 0; i < this.columns.length; i++) { 
    var column = this.columns[i].name 
    var search = this.tSearch[column] 

    if (!search && search.length === 0) continue 

    console.log(column + ': ' + ' (' + search + ') -> ' + rows.length) 
    rows = _.filter(rows, (row) => { 
     var value = '' + row[column] 
     value.search(search) > -1 
    }) 
    } 

    return rows 
} 
+0

Можем ли мы увидеть ваш код для вычисленного имущества? – Justin

+0

@ Justin: Конечно, я просто добавил. – Johannes

ответ

0

Просто предложение, но вы пытаетесь использовать Бодрствующего, чтобы получить старое и новое значение входа.

data: function() { 
    return { 
    propertyToWatch: 'something' 
    } 
}, 
computed: { 
    ... 
}, 
watch: { 
    'propertyToWatch': function (val, oldVal) { 
    console.log(oldVal); // logs old value 
    console.log(val); // logs current value 
    // here you can call a function and send both of these args and detect diff 
    } 
}, 
.... 
+0

Часы не выглядят так, как на глубоких свойствах. Новое значение всегда одно и то же для нового значения, и просто просмотр объекта, а не свойства объекта не помогает мне. – Johannes

+0

Это была мысль, жаль, что я не мог помочь. Если я подумаю о чем-то другом, я отредактирую. – peaceman

Смежные вопросы