在_.indexBy创建的对象上使用_.filter

时间:2016-01-29 16:57:53

标签: javascript jquery underscore.js

我从一组对象开始,使用_.filter过滤一些搜索条件,然后使用_.findWhere根据ID选择单个对象。

不幸的是,数据量增加了很多,因此使用_.indexBy按ID索引更有效率,所以我可以为_.findWhere做数据[ID] = id。

但是,如果不循环遍历数据中的所有键,我将无法替换_.filter方法。

有更好的方法吗?!

修改

ID始终是唯一的。 我无法显示任何真实数据,因为它很敏感,但结构是

data = {
    1: {id: 1, name: 'data1', date: 20/1/2016}
    2: {id: 2, name: 'data2', date: 21/1/2016},
    3: {....
}

我需要这样的事情:

var recentData = _.filter(data, function(d){d.date > 1/1/2016});

获取一组数据或ID。

(n.b。日期都在纪元时代)

1 个答案:

答案 0 :(得分:0)

这实际上是一个优化问题,而不仅仅是使用哪个函数。

如果我们可以依赖整个集合的排序顺序,那么有一件事要做。如果它已经排序,你可以使用二进制搜索之类的东西来查找日期范围的边框元素,然后从这一点拼接所有内容。 (旁注:数组可能会更好用)。

如果数组没有排序,您也可以考虑先在最后对它进行排序 - 但这只有在您需要从同一数据集中多次检索此类信息时才有意义。

但是如果你得到的只是数据,那么你必须从特定日期开始选择所有元素 - 没有其他方法可以使用像_.filter()那样迭代它。

或者你可以恢复到你的数据来源并检查你是否可以用这种方式改进结果 - 如果你使用某种API,可能还有额外的参数用于排序或缩小日期选择范围(通常说数据库引擎在你想要做的事情上真的很有效率吗?或者,如果您使用巨大的静态JSON作为源 - 可能考虑使用排序顺序改进该源对象?

只是一些想法。如果不知道你想要做的事情背后的故事,很难给你最好的分辨率。