如何让 Crossfilter 将数组元素作为单独记录而非整个数组作为键名?

Crossfilter 是一个流行的 JavaScript 库,用于快速筛选和分析大型数据集。但是,在使用 Crossfilter 处理包含嵌套数组的数据时,它默认将整个数组作为一个键名进行处理。这可能会给我们带来一些麻烦,因为我们无法像对待其他属性一样对待数组中的每个元素。

那么,有没有办法告诉 Crossfilter 将数组元素视为单独的记录而不是一个整体呢?本文将介绍如何通过一些技巧来实现这一目标。

使用 flattenArrays 函数

我们可以使用 crossfilter 的 crossfilter.utils.flattenArrays() 函数来展平包含嵌套数组的数据。该函数接受一个对象数组作为参数,并返回一个新的对象数组,其中所有包含数组的属性都已经被展平了。

例如,如果我们有以下数据:

----- ---- - -
  - --- -- ----- -------- -------- ----------- ----------- --
  - --- -- ----- ------ -------- ----------- --------- -
--

我们可以使用 flattenArrays 函数将其展开:

----- -------- - --------------------------------------
--
-
  - --- -- ----- -------- -------- --------- --
  - --- -- ----- -------- -------- ---------- --
  - --- -- ----- ------ -------- --------- --
  - --- -- ----- ------ -------- -------- -
-
--

现在,我们可以将 flatData 数组传递给 Crossfilter,并像对待其他属性一样进行过滤和分析。

使用 reduceSum 函数

如果我们需要计算数组中每个元素的总数,我们可以使用 Crossfilter 的 reduceSum 函数。该函数接受一个用于计算总和的函数作为参数,并返回一个新的 reduce 函数,该函数将应用于每个记录,并计算指定属性的总和。

例如,如果我们有以下展开后的数据:

----- -------- - -
  - --- -- ----- -------- -------- --------- --
  - --- -- ----- -------- -------- ---------- --
  - --- -- ----- ------ -------- --------- --
  - --- -- ----- ------ -------- -------- -
--

我们可以使用 reduceSum 函数来计算每个爱好出现的次数:

----- -- - ----------------------
----- -------- - -------------- -- -----------
----- ---------- - ----------------------------- -- ---
--
-
  - ---- ---------- ------ - --
  - ---- ----------- ------ - --
  - ---- ---------- ------ - --
  - ---- --------- ------ - -
-
--

现在,我们可以使用得到的 hobbyGroup 来进行过滤和分析。

使用自定义 reduce 函数

如果我们需要对数组中的元素执行其他操作,例如计算平均值或拼接字符串,我们可以使用自定义 reduce 函数。该函数将接受两个参数:一个累加器对象和当前记录的值,并返回更新后的累加器对象。

例如,如果我们想要计算每个人的爱好列表:

----- -- - ----------------------
----- --------- - -------------- -- ------
----- ------------ - -------------------------
  ----- ---- -- -
    ------------------------------
    ------ ----
  --
  ----- ---- -- -
    ---------------------------------------------------- ---
    ------ ----
  --
  -- -- ---------- ----
--
--
-
  - ---- -- ------ - -------- ----------- ----------- - --
  - ----

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------