0

我正在寻找关于我的应用程序的实用和理论见解。

取 50,000 个 js 对象,每个对象有 5 个属性,结构为

0: Object
  CostCenter: "1174"
  Country: "USA"
  Job: "110-Article Search"
  Team: "Financial"
  Username: "anderson"

并取 5 个相应的数组(每个对象属性一个),例如“Country”数组

4: Array[4]
  0: "Asia Pacific"
  1: "Australia"
  2: "Brazil"
  3: "Canada"

过滤 50,000 个对象的最有效方法是什么,消除所有具有至少一个在其各自数组中具有 0 个匹配项的属性的对象。

数组的最大大小为:

  CostCenter,  77
  Country,     27
  Job,         27
  Team,        10
  Username,    99

我的第一个想法是遍历 50,000 个对象,然后

if the 'CostCenter' property === any CostCenter array item,
push the object into a temporary array of objects 

这可能会让我在临时数组中只剩下 20,000 个对象。然后对每个属性及其各自的过滤数组重复此过程,每次都构建一个新的临时对象。

最后,这个过程会给我留下最后一个数组,这将是经过 5 个过滤器后的结果数据。

下载 18mb JSON 文件大约需要 20 秒(但我可以接受)

...这比我在 16gb ram 上的 chrome 浏览器将 JSON 处理为 50,000 个 js 对象并循环这些对象以动态构建具有 JSON 中包含的所有唯一值的过滤数组所需的时间成倍增长。

这有效率吗?处理的数据量似乎非常快,但我也感觉到一些用户环境(比如我老板的 iPad)可能会耗尽浏览器内存。

有什么更好的方法?

我应该在 Node.JS 中这样做吗?我是一名 javascript 程序员,所以看起来可能不需要太长时间来学习。Plus Node 这些天来超级时髦……也许我应该继续下去。

某些浏览器会无法下载 18mb 的 json 文件吗?我在哪里可以找到有关限制的信息?

4

1 回答 1

0

基本上你想要

var arrays = {
    "Country": […],
    …
};
var result = my50000items.filter(function(item) {
    for (var prop in arrays)
        if (arrays[prop].indexOf(item[prop]) == -1)
             return false;
    return true;
});

您可以通过用更快的属性查找替换indexOf调用来优化这一点。为此,请执行以下操作:

var lookups = {};
for (var prop in arrays) {
    var obj = lookups[prop] = {};
    for (var i=0; i<arrays[prop].length; i++)
        obj[arrays[prop][i]] = true;
}

然后你可以使用

var result = my50000items.filter(function(item) {
    for (var prop in lookups)
        if (!lookups[prop][item[prop]])
             return false;
    return true;
});
于 2013-08-28T22:20:45.280 回答