使用多个数组索引的高效Javascript对象过滤。使用Node之前有多少数据?

时间:2013-08-28 21:14:55

标签: javascript arrays json node.js filter

我正在寻找关于我的申请的实用和理论见解。

获取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文件?我在哪里可以找到有关限制的信息?

1 个答案:

答案 0 :(得分: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;
});