2017-01-26 19 views
1

私は動的に複数のJavaScriptファイルを結合したい、などのいくつかの機能を持つオブジェクトとして表される各:私はJSONオブジェクトに似ている1つのファイルを返したい組み合わせるJSファイル(JSONish)

// ./src/foo.js 
{ 
    "foo": function() { 
     console.log("foo"); 
    } 
} 

// ./src/bar.js 
{ 
    "bar": function() { 
     console.log("bar"); 
    } 
} 

// desired output 
{ 
    "foo": function() { 
     console.log("foo"); 
    }, 
    "bar": function() { 
     console.log("bar"); 
    } 
} 

。私は厳格なJSONを組み合わせた場合、この関数は次のように(非常に大まか)になります。

var files = ['./src/foo.json', './src/bar.json']; 
    var final = {}; 

    for(var i in files) { 
     var srcFile = files[i]; 
     var json = JSON.parse(fs.readFileSync(srcFile, 'utf8')); 
     Object.assign(final, json); 
    } 

    console.log(JSON.stringify(final, null, 2)); 

私のファイルは厳密にはJSON表現で許可されていない機能やコメントを、含まれているので、これは、しかし、動作するようには思えません。したがって、ファイルを.jsファイルとして保存する必要があり、この方法はオブジェクトを単一のオブジェクトにマージするためには機能しません。関数を含む "JSON"ファイルを読み込んでマージするにはどうすればいいですか?​​変数に関数を含むjavascriptオブジェクトを読み取るためにvar json = JSON.parse(fs.readFileSync(srcFile, 'utf8'));を置き換える何

  1. だから私の質問は2部に沸きますか?

  2. Object.assign({}, json)を機能的オブジェクトをマージする代わりには何ですか?ここ
+1

技術的にはjsonに関数を入れられません。しかし、あなたはそれの文字列表現を内部に入れることができます – kharandziuk

答えて

3

ソリューションの最初の部分:

const fs = require('fs') 
const files = ['./foo.js', './bar.js']; 
const Promise = require('bluebird'); 

const final = Promise.resolve(files) 
    .map(file => Promise.fromCallback(cb => fs.readFile(file, 'utf-8', cb))) 
    .reduce(
    function(acc, file) { 
     const obj = eval(`(${file})`) 
     return Object.assign(acc, obj) 
    }, 
    {} 
).then(function(final) { 
    console.log(final) 
    }) 

結果:

> node 1.js 
{ foo: [Function], bar: [Function] } 

今、あなたはあなたが機能

と第二を表現したいん方法を決定する必要がありますがあなたが見つけることができる部分here

注意:evalは安全ではありませんが、あなたの文脈では完全にOKだと思います。

+0

それは、ありがとう! – CaptainStiggz