生成JS对象字符串,但不生成JSON

时间:2018-12-06 05:16:09

标签: javascript json

我有一个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

写入文件

2 个答案:

答案 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));