组合JS文件(JSONish)

时间:2017-01-26 00:47:40

标签: javascript json node.js

我想动态组合多个javascript文件,每个文件都表示为具有一些函数的对象:

   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对象的文件。如果我正在组合严格的JSON,那么函数看起来(非常粗略地)就像这样:

var json = JSON.parse(fs.readFileSync(srcFile, 'utf8'));

然而,这似乎不起作用,因为我的文件包含JSON表示中不严格允许的函数和注释。因此,我必须将文件存储为.js文件,这种方法不适用于将对象合并到单个对象中。我怎样才能读入并合并" JSON"包含函数的文件?

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

  1. 是什么取代var json将包含函数的javascript对象读入Object.assign({}, json)变量?
  2. 什么取代class Child extends React.Component { render() { return <button onClick={this.handleChildOnClick} className="t-btn">{this.props.children}</button>; } handleChildOnClick() { this.props.onChildClick('foo'); } } 来合并功能对象?

1 个答案:

答案 0 :(得分: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是不安全的,但我认为在你的任务中它完全没问题