与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'
);
答案 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的支持。