(译)JSON.STRINGIFY替换参数的功能

725 阅读2分钟

原文:TIL — THE POWER OF JSON.STRINGIFY REPLACER PARAMETER

我有一个有趣的问题让我有些困惑。下面让我分享我所学到的知识,也许当您遇到类似挑战时可以节省您一些时间。让我们一起享受JSON.stringify的乐趣吧~

const dude = {
  name: "Pawel",
  friends: ["Dan", "Pedro", "Mr Gregory"]
};
const dudeStringified = JSON.stringify(dude);

console.log(dudeStringified);
// {"name":"Pawel","friends":["Dan","Pedro","Mr Gregory"]}

没有惊喜。不幸的是,我的项目(AWS DynamoDB 好奇野兽)中使用的架构迫使我不得不处理ES6zhong的Set。因此事情变得更有趣。看看这个:

const dude = {
  name: "Pawel",
  friends: new Set(["Dan", "Pedro", "Mr Gregory"])
};
const dudeStringified = JSON.stringify(dude);

console.log(dudeStringified);
// {"name":"Pawel","friends":{}}

我以为Set值将被转换为一个普通数组。您可能已经猜到我错了, Sets,WeakSets,Maps和WeakMaps被忽略或替换为null。不过还是有希望的——JSON.stringify可选的第二个参数允许我们处理所有Sets并将它们转换为数组。

const dude = {
  name: "Pawel",
  friends: new Set(["Dan", "Pedro", "Mr Gregory"])
};
const dudeStringified = JSON.stringify(dude, (key, value) =>
  value instanceof Set ? [...value] : value
);

console.log(dudeStringified);
// {"name":"Pawel","friends":["Dan","Pedro","Mr Gregory"]}

问题解决了👏

(TIL)Today I Learned

JSON.stringify()接受第二个可选参数,该参数可以是递归替换器函数或者是白名单键的数组。像这样:

// Second argument as a replacer function

const dude = {
  name: "Dan"
};
const dudeStringified = JSON.stringify(dude, (key, value) =>
  key === "name" ? "Pawel" : value
);

console.log(dudeStringified);
// {"name":"Pawel"}
// Second argument as an array of white-listed keywords

const dude = {
  name: "Pawel",
  friends: new Set(["Dan", "Pedro", "Mr Gregory"])
};

const dudeStringified = JSON.stringify(dude, ["name"]);

console.log(dudeStringified);
// {"name":"Pawel"}

第三个参数可以是stringnumber。它决定要用作分隔符的文本或空格的数量。看下面:


// Third argument as a number

const dude = {
  name: "Pawel",
  friends: ["Dan", "Pedro", "Mr Gregory"]
};
const dudeStringified = JSON.stringify(dude, null, 4);

console.log(dudeStringified);
// {
//   "name": "Pawel",
//   "friends": [
//       "Dan",
//       "Pedro",
//       "Mr Gregory"
//   ]
// }
// Third argument as a string

const dude = {
  name: "Pawel",
  friends: ["Dan", "Pedro", "Mr Gregory"]
};
const dudeStringified = JSON.stringify(dude, null, "🍆");

console.log(dudeStringified);
// {
// 🍆"name": "Pawel",
// 🍆"friends": [
// 🍆🍆"Dan",
// 🍆🍆"Pedro",
// 🍆🍆"Mr Gregory"
// 🍆]
// }

直到下次,请保持好奇💋