0

我正在使用 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;
  }
};

然后你在一个文件中逐个字符地写入该对象以供浏览器使用。

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 回答