你可能不知道 JSON.stringify() 的这些妙用

news/2024/7/10 0:16:17 标签: js, python, javascript, java, vue
js_content">

1.用来调试对象

我们先来看看下面这个代码在控制台中输出什么

javascript>javascript">//Initialize a User object
const user = {
"name" : "蔡生",
"age" : 26
}
console.log(user);
// [object Object]

看!console.log()没有输出我们想要的结果。它输出了[object Object],因为从对象到字符串的默认转换是“[objectObject]”。因此,我们使用 JSON.stringify()先将对象转换为字符串,然后把结果输入 console 控制台,如下所示。

javascript>javascript">const user = {
"name" : "蔡生",
"age" : 26
}
console.log(JSON.stringify(user));
// "{ "name" : "蔡生", "age" :26 }"

通常,开发人员使用这个 stringify 函数的方式很简单,像上面那样操作就可以。

2.存储 localStorage 对象

一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。下面的例子是 JSON.stringify  适用于这种情形的一个样板:

javascript>javascript">// 创建一个示例数据
var session = {
    'screens' : [],
    'state' : true
};
session.screens.push({"name":"screenA", "width":450, "height":250});
session.screens.push({"name":"screenB", "width":650, "height":350});
session.screens.push({"name":"screenC", "width":750, "height":120});
session.screens.push({"name":"screenD", "width":250, "height":60});
session.screens.push({"name":"screenE", "width":390, "height":120});
session.screens.push({"name":"screenF", "width":1240, "height":650});


// 使用 JSON.stringify 转换为 JSON 字符串
// 然后使用 localStorage 保存在 session 名称里
localStorage.setItem('session', JSON.stringify(session));


// 然后是如何转换通过 JSON.stringify 生成的字符串,该字符串以 JSON 格式保存在 localStorage 里
var restoredSession = JSON.parse(localStorage.getItem('session'));


// 现在 restoredSession 包含了保存在 localStorage 里的对象
console.log(restoredSession);

3.数组去重

有人把这个用在数组对象去重上,下面我举一个例子。

javascript>javascript">function unique(arr){
   let unique = {};
   arr.forEach(function(item){
     unique[JSON.stringify(item)]=item;//键名不会重复
   })
   arr = Object.keys(unique).map(function(u){ 
   //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组
     return JSON.parse(u);
   })
   return arr;
 }

存在的问题:{x:1,y:2}与{y:2,x:1}通过 JSON.stringify 字符串化值不同,但显然他们是重复的对象。

看起来只要把里面的属性排序一下,然后再进行下一步就可以了,我调整了一下,代码如下:

javascript>javascript">function unique(arr) {
  let unique = {};
  arr.forEach(function(item) {
                //调整属性顺序
    var newData = {};
    Object.keys(item).sort().map(key = >{
      newData[key] = item[key]
    })
    unique[JSON.stringify(newData)] = item; //键名不会重复
  })
  arr = Object.keys(unique).map(function(u) {
    //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组
    return JSON.parse(u);
  })
  return arr;
}

4.stringify 函数第二个参数的妙用

还是上面这道题,我们可以在第二个参数上解决对象属性的顺序问题,给它加上一个数组['name','author'],代码改为下面这个就没问题了。

javascript>javascript">function unique(arr) {
  let unique = {};
  arr.forEach(function(item) {
    unique[JSON.stringify(item,['name','author'])] = item;
  })
  arr = Object.keys(unique).map(function(u) {
    //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组
    return JSON.parse(u);
  })
  return arr;
}

正如你所知,第二个参数可以决定筛选出来的内容,当然它还有第三个参数,这里不展开了,有兴趣看 MDN。

5.实现深拷贝

实际开发中,如果怕影响原数据,我们常深拷贝出一份数据做任意操作,其实使用 JSON.stringify()与 JSON.parse()来实现深拷贝是很不错的选择。

javascript>javascript">//深拷贝
function deepClone(data) {
    let _data = JSON.stringify(data),
        dataClone = JSON.parse(_data);
    return dataClone;
};
//测试
let arr = [1,2,3],
    _arr = deepClone(arr);
arr[0] = 2;
console.log(arr,_arr)//[2,2,3]  [1,2,3]

6.判断数组是否包含某对象,或者判断对象是否相等。

javascript>javascript">//判断数组是否包含某对象
let data = [
    {name:'echo'},
    {name:'前端开发博客'},
    {name:'蔡生'},
    ],
    val = {name:'蔡生'};
JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1;//true


//判断两数组/对象是否相等
let a = [1,2,3],
    b = [1,2,3];
JSON.stringify(a) === JSON.stringify(b);//true
◆ ◆ ◆  ◆ ◆
长按关注小生

你的在看我当成喜欢


http://www.niftyadmin.cn/n/1252154.html

相关文章

mysql创建服务器对象,使用navicat建立与服务器的远程mysql连接

这里举例服务器的ip:192.168.16.98;客户端的ip:192.168.61.201具体的机器的ip请对照更改即可附 mysql 重启的命令启动mysql命令:sudo /etc/init.d/mysql start停止mysql命令:sudo /etc/init.d/mysql stop重启mysql命令:sudo /etc/init.d/mysq…

推荐一位实力超强的平安前端算法大佬:瓶子君

今天给大家推荐一位平安大佬:前端瓶子君,一个专注于前端开发的小瓶子,五年大厂开发经验,掘金优秀作者。「前端进阶算法」系列是她4月初发起的活动,从 0 到 1 构建完整的前端数据结构与算法体系。这是一个专注于前端算法…

matlab伪随机码,Matlab生成M序列的伪随机码

图3.5 线性反馈移位寄存器MATLAB生成M序列伪随机码函数如下:% 在MATLAB命令窗口输入以下: % fbconnection[0 1 1 0 1 0 0 0 0 0 0 0 0 0 0% 1];本原多项式系数:[d0,d1,d2...di];其中di为本原多项式前的系数% mseqm_sequence(fbconnection); % mseq%m_seq…

mysql查询入职之间超过3个月,oracel的惯用查询方法的例子

oracel的常用查询方法的例子!--创建职员表create table tbEmp(eIDnumberprimary key,--职员编号eNamevarchar2(20)not null,--职员姓名eSexvarchar2(2)not null --职员性别check(esex in (男,女)),eAgenumbernot null check(eage>18),--职员年龄eAddrvarchar2(50…

mysql查询树形结构数据库设计,树形结构的数据库表Schema设计

那么某个节点到底有多少的子孙节点呢?经过该节点的左、右值咱们能够将其子孙节点圈进来,则子孙总数 (右值 – 左值– 1) / 2,以Fruit为例,其子孙总数为:(11 –2 – 1) / 2 4。同时,为了更为直观地展示树形…

Vue 第一次 commit 原来是这个样子

前言周末在家休息,突然想看看 Vue 第一次的 commit 提交了什么,想看看 Vue 最开始的样子。查看之后发现 Vue 的第一版并没有我想象的那么完美,可以说有些简陋。但这不影响 1 年多以后这个框架的流行。查看 Vue 的第一次 commit不知道有没有同…

php系统实现数据填写与统计,使用Asp.net实现信息管理系统的数据统计功能

这篇文章主要介绍了Asp.net管理信息系统中数据统计功能的实现方法,需要的朋友可以参考下数据统计是每个系统中必备的功能,在给领导汇报统计数据,工作中需要的进展数据时非常有用。在我看来,一个统计的模块应该实现以下功能:能够将…

完全理解 redux(从零实现一个 redux)

前言记得开始接触 react 技术栈的时候,最难理解的地方就是 redux。全是新名词:reducer、store、dispatch、middleware 等等,我就理解 state 一个名词。网上找的 redux 文章,要不有一本书的厚度,要不很玄乎,…