你不知道的JSON.stringify()妙用

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

1.用来调试对象

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

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

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

javascript>javascript">const user = {
"name" : "蔡生",
"age" : 26
}
console.log(JSON.stringify(user));RESULT
// "{ "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

最后

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

  2. 欢迎加我微信「qianyu443033099」拉你进技术群,长期交流学习...

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。

点个在看支持我吧,转发就更好了


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

相关文章

【C语言】04-函数

本文目录 一、函数的分类二、函数的声明和定义三、函数的形参和实参说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣&a…

ASP.NET如何防范SQL注入式攻击(转)

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入…

苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快

作者 | 禹立彬 编辑 | 薛梁 前端 Node.js 的使用场景大多集中在前端工具上,当前的前端主要把它定位为辅助。苏宁易购使用 Node.js 作为前后端分离的主要手段,经历了从技术引进到全面开花,从边缘功能到核心业务,从纷乱到稳定的过程…

谢文《互联网发展趋势和SNS走向》讲座听后总结

今天公司研究院邀请谢文先生就互联网的发展趋势、Web2.0的走向、SNS的未来等内容与同事分享交流。 仰慕谢文许久,配服其丰富的互联网行业经验和长远到位的眼光,帮带着成分激动的心情参与了讲座的整个过程。听后感觉视野开阔了不少,面对漫无边…

一文搞懂Node.js以及浏览器中的事件循环机制

原文转自:Node.js VS 浏览器以及事件循环机制 https://juejin.im/post/6871832597891121166本文主要梳理node.js,浏览器相关及Event Loop事件循环等,会持续补充更新哦!首先我们要记住JS是一个单线程的语言。JS同步异步 同步阻塞**…

通过WireShark抓取iOS联网数据实例分析

本文转载至http://blog.csdn.net/lixing333/article/details/7782539 iosiphone网络filter工具 我在另外一篇博客里,介绍了一款比Wireshark更轻量、更好用的软件:Charles: http://blog.csdn.net/lixing333/article/details/42776187 今天闲的…

Mathematica 9设置C编译器

来源:http://hypergroups.github.io/Mathematica%E8%AE%BE%E7%BD%AEC%E7%BC%96%E8%AF%91%E5%99%A8/ 因为Mathematica某一版本推出后,使用的是当时的其他产品的信息,比如JDK等,比如9.0只识别到VC2010 Needs["CCompilerDriver…

送你21道精选高频JavaScript手写面试题(建议收藏)

前言基本上面试的时候,经常会遇到手撕XXX之类的问题,这次准备梳理总结一遍,巩固我们原生JS基础的同时,下次想复习面试手撕题的时候,找起来方便,也节省时间。代码在这里????GitHub梳理的顺序是随机的&am…