Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 组合JS文件(JSONish)_Javascript_Json_Node.js - Fatal编程技术网

Javascript 组合JS文件(JSONish)

Javascript 组合JS文件(JSONish),javascript,json,node.js,Javascript,Json,Node.js,我希望动态组合多个javascript文件,每个文件都表示为一个对象,并具有以下几个函数: // ./src/foo.js { "foo": function() { console.log("foo"); } } // ./src/bar.js { "bar": function() { console.log("bar"); } } // desired output { "foo": function() { co

我希望动态组合多个javascript文件,每个文件都表示为一个对象,并具有以下几个函数:

// ./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对象的文件。如果我结合了严格的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”文件

所以我的问题归结为两部分:

  • 什么替代了
    var json=json.parse(fs.readFileSync(srcFile,'utf8')
    将包含函数的javascript对象读入
    var json
    变量
  • 什么替换了
    Object.assign({},json)
    来合并函数对象

  • 这里是解决方案的第一部分:

    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] }
    
    现在需要决定如何表示函数

    第二部分你可以找到


    注意:eval是不安全的,但我认为在您任务的上下文中,它完全可以

    从技术上讲,您不能将函数放在json中。但是你可以把它的字符串表示放在里面