[英]How to write a complex object in memory to a file in nodejs
我正在使用nodejs動態創建一個復雜的對象,以將這些數據寫入文件以用作前端實用程序庫。
有什么辦法可以將該對象讀取/寫入文件?
我知道的方法不足:
JSON.stringify
:需要輸出方法
jsDump :以函數體的[code]
塊結尾
試圖從對象創建一個新的Buffer
Function.prototype.toString
我開始認為這是不可能的。 誰能證明我錯了?
注意 :只需讀取/合並/寫入文件以及適用於瀏覽器的代碼一樣簡單,我還希望能夠將其用作npm軟件包。 該庫以一種方式設置,其中可重復使用的每一位代碼都駐留在其自己的文件中。 使用構建工具,您可以選擇要包含在最終結果中的文件。 我所說的復雜對象實際上只是所有產生的功能的全局命名空間。
編輯清晰
結果對象存儲在內存中
var obj = {
foo: 'a string',
reg: /\s+/,
num: 100,
fart: function (name) {
return name + ' farted and it sounded like pffftt';
},
Fart: function (sound) {
this.sound = sound;
}
};
然后,將該對象的字符換字符寫入文件中,以供瀏覽器使用。
這是一個演示,涵蓋了您的測試用例: http : //jsfiddle.net/ZFUws/ 。
函數isArray(obj){return Array.isArray(obj); }
function isObject (obj) { //detect only simple objects
return obj.__proto_ === Object.prototype;
}
function each (obj, iterator) {
for (var key in obj) if (obj.hasOwnProperty(key)) iterator(obj[key]);
}
function map (obj, iterator) {
if (Array.isArray(obj)) return obj.map(iterator);
var newObj = {};
for (var key in obj) if (obj.hasOwnProperty(key)) newObj[key] = iterator(obj[key]);
return newObj;
}
var special = {
'regexp' : {
match : function (obj) {
return obj instanceof RegExp;
},
serialize : function (obj) {
return {
$class : 'regexp',
source : obj.source,
global : obj.global,
multiline : obj.multiline,
lastIndex : obj.lastIndex,
ignoreCase : obj.ignoreCase
}
},
deserialize : function (json) {
var flags = '',
regexp;
flags += json.global ? 'g' : '';
flags += json.multiline ? 'm' : '';
flags += json.ignoreCase ? 'i' : '';
regexp = new RegExp(json.source, flags);
regexp.lastIndex = json.lastIndex
return regexp;
}
},
'function' : {
match : function (obj) {
return obj instanceof Function;
},
serialize : function (obj) {
return {
$class : 'function',
source : obj.toString()
}
},
deserialize : function (json) {
return (new Function('return ' + json.source))();
}
}
}
function toJSON (obj) {
return map(obj, function (val) {
var json;
each(special, function (desc) {
if (desc.match(val)) json = desc.serialize(val);
});
if (isArray(val) || isObject (val)) json = toJSON(val);
return json ? json : val;
});
}
function fromJSON (json) {
return map(json, function (val) {
var obj;
if (val.$class) {
obj = special[val.$class].deserialize(val);
}
if (isArray(val) || isObject (val)) obj = fromJSON(val);
return obj ? obj : val;
});
}
var obj = {
foo: 'a string',
reg: /\s+/,
num: 100,
fart: function (name) {
return name + ' farted and it sounded like pffftt';
},
Fart: function (sound) {
this.sound = sound;
}
};
var serialized = JSON.stringify(toJSON(obj)),
deserialized = fromJSON(JSON.parse(serialized));
console.log(deserialized.foo);
console.log(deserialized.num);
console.log('11 '.search(deserialized.reg));
console.log(deserialized.fart('John'));
console.log(new deserialized.Fart('pffftt').sound);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.