簡體   English   中英

如何將內存中的復雜對象寫入Node.js中的文件

[英]How to write a complex object in memory to a file in nodejs

我正在使用nodejs動態創建一個復雜的對象,以將這些數據寫入文件以用作前端實用程序庫。

有什么辦法可以將該對象讀取/寫入文件?

我知道的方法不足:

我開始認為這是不可能的。 誰能證明我錯了?

注意 :只需讀取/合並/寫入文件以及適用於瀏覽器的代碼一樣簡單,我還希望能夠將其用作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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM