我正在寻找关于我的申请的实用和理论见解。
获取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文件?我在哪里可以找到有关限制的信息?
答案 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;
});