了解.map和Stringify与对象

时间:2018-11-24 23:08:56

标签: javascript

我在JS上尝试其他方法以了解它们的性能。

为了测试,我想了解如果我这样做 JSON.stringify(something)直接与使用Map进行比较。

直接通过 JSON.stringify(something)

var rockets = [
    { country:'Russia', launches:32 },
    { country:'US', launches:23 },
    { country:'China', launches:16 },
    { country:'Europe(ESA)', launches:7 },
    { country:'India', launches:4 },
    { country:'Japan', launches:3 }
];

console.log(JSON.stringify(rockets))

我在控制台中的位置

[{"country":"Russia","launches":32},{"country":"US","launches":23},{"country":"China","launches":16},{"country":"Europe(ESA)","launches":7},{"country":"India","launches":4},{"country":"Japan","launches":3}]

Map的对比我知道了

var rockets = [
    { country:'Russia', launches:32 },
    { country:'US', launches:23 },
    { country:'China', launches:16 },
    { country:'Europe(ESA)', launches:7 },
    { country:'India', launches:4 },
    { country:'Japan', launches:3 }
];

console.log(rockets.map(d => JSON.stringify(d)))

我在哪里得到这样的东西

["{"country":"Russia","launches":32}", "{"country":"US","launches":23}", "{"country":"China","launches":16}", "{"country":"Europe(ESA)","launches":7}", "{"country":"India","launches":4}", "{"country":"Japan","launches":3}"]

现在,我试图理解代码和JSON.stringify(something)都有意义,但是当我查看Map时,我发现在"之后添加了[我不知道它来自哪里?

Chrome控制台和stackoverflow的结果也有所不同,有人可以解释一下为什么我在stackoverflow结果的\之前看到"吗?

示例[ "{\"country\":\"Russia\",\"launches\":32}",

总结一下,我的主要问题是.map如何与json字符串化一起使用?

2 个答案:

答案 0 :(得分:1)

第一个JSON.stringify(rockets)产生单个长字符串,该字符串包含可以用JSON.parse转换为对象数组的序列化数据。

第二个rockets.map(d => JSON.stringify(d)产生一个数组,其每个项目都是一个字符串,可以反序列化为一个小对象。

下面的代码中"之前的反斜杠有点令人困惑,这是因为堆栈控制台使用"分隔字符串。如果使用'-'会更清楚,最下面的结果看起来像

[
  '{"country": "Russia","launches": 32}',
  '{"country": "US","launches": 23}',
  '{"country": "China","launches": 16}',
  // ...
]

这是第二个代码段产生的完全相同的数组

var rockets = [
    { country:'Russia', launches:32 },
    { country:'US', launches:23 },
    { country:'China', launches:16 },
    { country:'Europe(ESA)', launches:7 },
    { country:'India', launches:4 },
    { country:'Japan', launches:3 }
];

console.log(rockets.map(d => JSON.stringify(d)))

除了以易于阅读的格式显示外,因为数组项(字符串)用'分隔,因此字符串中的文字"不需要先用反斜杠转义。

(就像一条线

const str = 'foo'

等同于使用

const str = "foo"

,以及操作方式

const str2 = 'fo"o'

等同于

const str2 = "fo\"o"

:也就是说,要表示要用作字符串定界符的相同字符,必须先在其前面加上反斜杠)

请注意,JSON字符串要求键和字符串值必须用双引号"括起来,而对象文字(例如上面显示的)则不需要。

答案 1 :(得分:1)

因此,您试图区分JSON.stringify(something).map(JSON.stringify)的是,第一个创建一个字符串,第二个创建一个字符串列表。

使用"[之后的.map是因为您的控制台试图说console.log中包含的是一个字符串列表。而在JSON.stringify(something)的结果中,整个输出是一个字符串,因此整个输出以"开头和结尾。

StackOverflow与Chrome的输出\之间的区别只是一个转义字符。