Excel就像列标题选项过滤算法

时间:2018-03-02 16:03:27

标签: javascript excel algorithm filter

在excel表格中,当我在一列上设置过滤器时,它会过滤其他列的不相关过滤器选项,等等。

但我需要知道Excel使用什么算法来执行此操作以及是否有任何JS实现。

我尝试在应用新过滤器时更新每列的唯一值列表,但是使用这种方法,我在前一个过滤器列上丢失了未选择的选项。 Excel以某种方式设法保留它们。

这个问题看起来很相似,但它询问具体的实现,我需要的是算法或至少它的名称:Angular JS Excel like filtering

当前实施的伪代码:

var allRows: {[columnKey]: string}[]
var visibleRows: {[columnKey]: string}[]
var filterColumns: {[columnKey]: string[]}
var columns: { columnKey: string }[]
var uniqueValues: {[columnKey]: string[]}

/* when header menu opens it gets unique values
from the column as filter options */
function getHeaderValues(columnKey): string[] {
    return uniqueValues[columnKey]
}

/* when user applies filter this function is being called
to update visible rows and unique values */
function setFilter(filterColumn: string, values: string[]) {
    filterColumns = {
        ...filterColumns,
        [filterColumn]: values 
    }

    visibleRows = getRows(allRows, filterColumns)
    uniqueValues = updateUniqueValues(columns, visibleRows)
}

2 个答案:

答案 0 :(得分:3)

这样的算法的基本思想是每个过滤器都是根据当前可用的数据计算的。应用过滤器时,其他过滤器将根据新的当前可用值集重新计算。请考虑以下数据:

FOO BAR
===========
1   1
1   2
2   3
2   4

FOO的过滤器的值为1,2,BAR的过滤器的值为1,2,3,4。当我将FOO过滤为1时,工作表显示:

FOO BAR
===========
1   1
1   2

并重新计算所有过滤器的可用值。现在我们看到BAR只有1,2的值。

已编辑以进一步澄清:
1.初始过滤:完整数据的所有列
2.过滤列A.现在不重新计算列A,但所有其他列都是
3.过滤柱B:不重新计算B列,但包括A列在内的所有其他列都是
因此,您无法点击导致无数据的过滤器 5.在第4步中,您确实失去了通过一切过滤A列的选项 - 但这样做很好!因为你不能通过你在B上使用的过滤器来获得不可用的东西来过滤A.这会导致空集,但是通过使用这种迭代方法来重新计算过滤器来阻止它

答案 1 :(得分:0)

由于提供的上下文不多,我假设您有一个对象数组,每个对象代表一行。为简单起见,我们可以假设每个对象看起来如下所示:

const row = { col1: 'value1', col2: 'value2', col3: 'value3' };

要过滤由上述格式的多行组成的数组,可以使用数组filter函数。此函数为您提供一个新数组,其中包含满足过滤条件的值(即行),同时保留原始数组。将列2过滤为等于'v1'或'v2'的简单实现如下:

const rows = [
  { col1: 'value1', ... },
  { ... }
];

const filteredRows = rows.filter((row) => row.col2 === 'v1' || row.col2 === 'v2');