我有一个json对象,如下所示:
obj = {
a : 123,
b : 456,
c : 678,
d : "abcd",
}
我想创建此对象的字符串化版本,而不是JSON.stringify
结果。 JSON.stringify
的结果是这样的:
{
"a" : 123,
"b" : 456,
"c" : 678,
"d" : "abcd",
}
但我希望它像这样:
{
a : 123,
b : 456,
c : 678,
d : "abcd",
}
甚至:
{
a : 123,
b : 456,
c : 678,
d : 'abcd',
}
可以忽略函数,其原因是因为我想为夹具生成一些样本数据,但是由于双引号和不必要的引号,eslint会产生噪音。由此产生的字符串将使用fs.writeFileSync
答案 0 :(得分:1)
一个有限的选择是在"word":
字符串中搜索JSON.stringify
模式,并仅用单词字符和冒号代替,并省略引号:
const customStringify = obj => JSON.stringify(obj)
.replace(/"(\w+)":/g, '$1:');
const obj = {
a : 123,
b : 456,
c : 678,
d : "abcd",
};
console.log(
customStringify(obj)
);
更灵活的方法是创建自己的递归字符串化函数:
const customStringify = obj => {
if (Array.isArray(obj)) {
return '[' + obj
.map(customStringify)
.join(',')
+ ']';
}
if (typeof obj === 'object') {
// Plain object:
return '{' + Object.entries(obj)
.map(([key, val]) => key + ':' + customStringify(val))
.join(',')
+ '}';
}
// Primitive value:
return JSON.stringify(obj);
};
const obj = {
a : 123,
b : 456,
c : 678,
d : "abcd",
e: [ { foo: 'bar', arr: ['baz', 4, 'buzz'] }]
};
console.log(
customStringify(obj)
);
答案 1 :(得分:0)
使用reduce
和某些ES6功能可以轻松实现。
let obj = {
a : 123,
b : 456,
c : 678,
d : "abcd",
};
function objToString(obj) {
return '{ \n' + Object.keys(obj).reduce((acc,key) => {
return `${acc} ${key} : ${obj[key]}, \n`;
}, '') + '}';
}
console.log(objToString(obj));