将JavaScript对象呈现为文字

时间:2019-07-02 17:38:57

标签: javascript node.js

this question中一样,我想将一个大型javascript对象写为对象文字而不是字符串,因此可以避免以后再使用JSON.parse。有没有一种方便的方法可以像这样渲染我的对象:

const myObject = { "someKey": "someValue" };

不是这样吗?

const myString = "{ \"someKey\":\"someValue\" }";
const myObject = JSON.parse(myString);

编辑:对不起,我第一次不清楚。我想编写Javascript代码以将对象文字打印到文件中。如果我使用JSON.stringify,则会得到一个字符串,而不是文字。

我想要的是类似此功能的东西:

function writeObjectLiteral(objectToWrite) {
  const objectAsLiteralString = _.map(objectToWrite, (value, key) => {
    if (Array.isArray(value)) {
      return `${key}:[${value.join(',')}]`;
    }
    if (typeof value === 'object') {
      return `${key}:${writeObjectLiteral(value)}`;
    } else {
      return `${key}:${value}`;
    }
  }).join(',');

  return `{${objectAsLiteralString}}`;
}

const testObject = {
  something: "whatever",
  array: [
    'something',
    'other thing'
  ],
  nestedObj: {
    something: "whatever",
    array: [
      'something',
      'other thing'
    ]
  }
};

fs.writeFileSync(
  'outputFile', 
  'const myObject = ' + writeObjectLiteral(testObject) + ';', 'utf8'
);

1 个答案:

答案 0 :(得分:0)

您提出的解决方案是正确的方法,一旦完成,就可以解决问题。但是,它仅考虑数组和其他对象,这实际上是JSON规范。在那种情况下,我认为您实际上是想编写JSON对象而不是JavaScript对象文字。

尽管您的意见有何建议,但在这种情况下,最惯用的解决方案是仅使用JSON.stringify,因为它偶然会产生有效的对象文字。

假设您使用的是节点的最新LTS v10.16.0,则以下代码将根据提议的解决方案生成语法上正确的版本。

const testObject = {
  something: "whatever",
  array: [
    'something',
    'other thing'
  ],
  nestedObj: {
    something: "whatever",
    array: [
      'something',
      'other thing'
    ]
  }
};

fs.writeFileSync(
  'test.js', 
  'const myObject = ' + JSON.stringify(testObject) + ';', 'utf8'
);
// Result:
// const myObject = {"something":"whatever","array":["something","other thing"],"nestedObj":{"something":"whatever","array":["something","other thing"]}};

如果要考虑可读性,那么我建议使用:

JSON.stringify(
  testObject, 
  null, // represents the replacer function. (in this case we don't want to alter the data)
  2 // number of spaces to indent
)

// Result:
// const myObject = {
//   "something": "whatever",
//   "array": [
//     "something",
//     "other thing"
//   ],
//   "nestedObj": {
//     "something": "whatever",
//     "array": [
//       "something",
//       "other thing"
//     ]
//   }
// };

正如slebetman在评论中指出的那样,Firefox打印"{ \"someKey\":\"someValue\" }",而Node和Chrome打印'{"someKey":"someValue"}'。但是,每个环境的JSON.stringify的本机实现都会产生未转义的版本。

如果您实际上需要编写 true JavaScript对象文字,那么可以考虑在建议的解决方案中扩展对其余JavaScript data types的支持。