2013-10-27 55 views
0

我正在使用nodejs動態創建複雜對象,以便將此數據寫入文件以用作前端實用程序庫。如何將內存中的複雜對象寫入nodejs中的文件

有沒有什麼方法可以將此對象讀取/寫入文件?

方法我知道功虧一簣:

我開始認爲這僅僅是不可能的創建一個新的Buffer。任何人都能證明我錯了嗎?

注意:就像讀取/連接/寫入文件一起使用瀏覽器的可用代碼一樣簡單,我也希望能夠將它用作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; 
    } 
}; 

然後你寫的對象字符的字符爲在瀏覽器中使用的文件

+0

@Mörre是的,我同意。這裏的問題是,如果有可能在內存中讀取數據(整個對象)並將其寫入文件。 – davidg

+1

當然沒有,因爲你沒有這種語言的內存級訪問。你花了太多時間用C(++):-) –

+0

@Mörre這是一個可以接受的答案。 – davidg

回答

0

下面是一個演示,其中涵蓋了您的測試用例:http://jsfiddle.net/ZFUws/

function isArray(obj){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); 
+0

感謝您的努力!我將實現這一點,看看它如何寫入文件併發布結果。 – davidg

相關問題