0

このデータをフロントエンド ユーティリティ ライブラリとして使用するためにファイルに書き込むために、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;
  }
};

そして、ブラウザで使用するために、そのオブジェクトを 1 文字ずつファイルに書き込みます。

4

1 に答える 1

0

テストケースをカバーするデモがあります: 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);
于 2013-10-27T13:08:49.830 に答える