Javascript 对由0.indexBy创建的对象使用0.filter

Javascript 对由0.indexBy创建的对象使用0.filter,javascript,jquery,underscore.js,Javascript,Jquery,Underscore.js,我从一个对象数组开始,使用u.filter向下过滤一些搜索条件,并使用u.findWhere根据ID选择单个对象 不幸的是,数据量增加了很多,因此使用u.indexBy按ID进行索引效率更高,这样我就可以只为u.findWhere的执行data[ID]=ID 然而,如何在不循环遍历数据中的所有键的情况下替换u.filter方法让我感到困惑 还有更好的办法吗 编辑 ID总是唯一的。 我不能显示任何真实的数据,因为它是敏感的,但结构是复杂的 data = { 1: {id: 1, name:

我从一个对象数组开始,使用u.filter向下过滤一些搜索条件,并使用u.findWhere根据ID选择单个对象

不幸的是,数据量增加了很多,因此使用u.indexBy按ID进行索引效率更高,这样我就可以只为u.findWhere的执行data[ID]=ID

然而,如何在不循环遍历数据中的所有键的情况下替换u.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的数组


(注意,日期都是大纪元)

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

要做到这一点的一件事是,我们是否可以依赖于整个集合的排序顺序。如果已经排序,您可以使用类似于二进制搜索的方法查找日期范围的边界元素,然后从这一点拼接所有内容。(旁注:阵列可能会更好地用于此)

如果数组没有排序,你也可以考虑首先在你的末尾排序它,但是只有当你需要从同一个数据集中多次检索这样的信息时才有意义。 但是,如果您得到的只是未排序的数据,并且您需要从某个日期开始拾取所有元素,那么没有其他方法可以使用类似于u.filter()的东西遍历所有元素

或者,您可以返回到数据源,并检查是否可以通过这种方式改进结果-如果您使用某种API,可能会有额外的参数用于排序或缩小日期选择范围(一般来说,数据库引擎在您尝试执行的操作中非常有效)?或者,如果您使用一个巨大的静态JSON作为源代码,可能会考虑用排序顺序来改进源对象(

)。
只是一些想法。如果不知道你要做的事情背后的所有故事,就很难给出最佳解决方案。

id是唯一的吗?抛出整个对象数组?那么你就不需要过滤两次了。如果没有,你能提供一些代码吗?现在,我只能建议您按一些条件(可能是按ID)对数组进行排序,使其始终保持排序状态,这样当您需要在其中查找某些内容时,它会更快(例如,使用二进制搜索)。数据基本上是从数据库发送的静态JSON,但对于页面上的每个操作都是中心的,因此始终发送ajax请求的速度非常慢。根据观看者的不同,它们的顺序也不同。我可以对主集合进行排序,然后在渲染时对其进行不同的排序,但这似乎也是无效的,因为仍然没有足够的信息。数据集有多大,有什么样的其他数据,在每个场景中有什么相关,等等。有很多变量需要考虑。还有一件事可能是你这里的一个问题-你提到你主要比较日期。这实际上可能是一个相当昂贵的操作(性能方面)。确保在比较日期时,不会实际解析任何日期字符串。直接比较unix时间戳或yyyy mm dd字符串,无需解析。这也许能救你一命。到底有多少条记录?我们使用纪元时间(如编辑中所述),所以不要比较日期字符串,我只是用它作为简写。目前有132000个条目。