这是我的简短实现:
Object.unflatten = function(data) { "use strict"; if (Object(data) !== data || Array.isArray(data)) return data; var regex = /.?([^.[]]+)|[(d+)]/g, resultholder = {}; for (var p in data) { var cur = resultholder, prop = "", m; while (m = regex.exec(p)) { cur = cur[prop] || (cur[prop] = (m[2] ? [] : {})); prop = m[2] || m[1]; } cur[prop] = data[p]; } return resultholder[""] || resultholder;};
flatten并没有太大的改变(我不确定您是否真的需要这些
isEmpty情况):
Object.flatten = function(data) { var result = {}; function recurse (cur, prop) { if (Object(cur) !== cur) { result[prop] = cur; } else if (Array.isArray(cur)) { for(var i=0, l=cur.length; i<l; i++) recurse(cur[i], prop + "[" + i + "]"); if (l == 0) result[prop] = []; } else { var isEmpty = true; for (var p in cur) { isEmpty = false; recurse(cur[p], prop ? prop+"."+p : p); } if (isEmpty && prop) result[prop] = {}; } } recurse(data, ""); return result;}
他们一起运行您的基准测试大约需要一半的时间(Opera12.16:〜900ms而不是〜1900ms,Chrome29:〜800ms而不是〜1600ms)。
注意:
这里回答的此解决方案和大多数其他解决方案都集中在速度上,并且容易受到原型污染的影响,因此不能在不受信任的对象上使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)