Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理40MB+;JS中的对象_Javascript_Node.js_Google Chrome_Callstack - Fatal编程技术网

Javascript 处理40MB+;JS中的对象

Javascript 处理40MB+;JS中的对象,javascript,node.js,google-chrome,callstack,Javascript,Node.js,Google Chrome,Callstack,我有一个不寻常的情况,涉及179586个chrome书签。大多数都是重复的,我需要删除它们 显然,这个过程需要通过脚本实现自动化 Chrome的bookmarks API对允许的操作速率强制执行了严格的配额,因此我必须首先将数据导出为更有利于脱机操作的格式 chrome.bookmarks.getTree(function(t){tree = t[0]}); 在中的全局变量树下存储整个存储库 显示对象(至少使用JSON编码)的长度为42777359字节 JSON.stringify(tree)

我有一个不寻常的情况,涉及179586个chrome书签。大多数都是重复的,我需要删除它们

显然,这个过程需要通过脚本实现自动化

Chrome的bookmarks API对允许的操作速率强制执行了严格的配额,因此我必须首先将数据导出为更有利于脱机操作的格式

chrome.bookmarks.getTree(function(t){tree = t[0]});
在中的全局变量
树下存储整个存储库

显示对象(至少使用JSON编码)的长度为
42777359
字节

JSON.stringify(tree).match(/"url"/g).length
显示总共有
179586个
书签

所以,为了让整个事情变得简单:

var ALL = [], stack = [];
function processTree(tree) {
  if(!(!tree.url != !tree.children)) throw tree;

  var entry = (tree.url ? [tree.url, tree.title] : ["FOLDER", tree.title]).concat(stack);
  entry.dateAdded = tree.dateAdded;

  ALL.push(entry);

  if(tree.children) {
    stack.unshift(tree.title);
    tree.children.forEach(processTree);
    stack.shift();
  }

  return 'done.';
}
不幸的是,我不仅没有从中得到预期的结果,而且还得到:
uncaughtrangeerror:超过了最大调用堆栈大小
。当我检查
ALL
stack
时,它们看起来都是长度为17388的数组<代码>堆栈
只由空字符串组成,而
ALL
只由空字符串组成的数组组成

有谁知道如何解决这个问题吗?也许Node.js比Chrome开发控制台更适合处理阶段的环境,我现在应该把重点放在如何处理JSON上

也许Node有一个更灵活、更可配置的callstack限制和其他类似参数


谢谢你的想法!:)

我将研究蹦床,但是我如何在不知道文件夹的最大深度的情况下使其成为非递归的呢?这不是无限递归的吗?你总是经过同一棵树。啊,我也是!让我试着把它修好。@bfavareto是的,就是这样!非常感谢:)
var ALL = [], stack = [];
function processTree(tree) {
  if(!(!tree.url != !tree.children)) throw tree;

  var entry = (tree.url ? [tree.url, tree.title] : ["FOLDER", tree.title]).concat(stack);
  entry.dateAdded = tree.dateAdded;

  ALL.push(entry);

  if(tree.children) {
    stack.unshift(tree.title);
    tree.children.forEach(processTree);
    stack.shift();
  }

  return 'done.';
}