JSON 对象的这些操作和使用场景你知道多少?

JSON 对象对应前端的同学一定不陌生,使用地非常频繁和常见,在这里顺便总结一下对 JSON 对象的操作和使用场景

1、添加 JSON 的属性

可通过 . 或 [] 的方式对 JSON 内容的增加。

const data = {};// 第一种方式:data.name = “kevin”;// 第二种方式:data[‘age’] = 18;console.log(data); // {name: “kevin”, age: 18}

2、访问 JSON 的值

可通过 . 或 [] 的方式对 JSON 内容的访问。

const data = { name: “kevin”, age: 18};// 第一种方式:console.log(data.name); // “kevin”// 第二种方式:console.log(data[“name”]); // “kevin”

3、修改 JSON 的值

可通过 . 或 [] 的方式对 JSON 内容的修改更新。

const data = { name: “kevin”, age: 18};// 第一种方式:data.name = “kevin2”;// 第二种方式:data[‘age’] = 20;console.log(data); // {name: “kevin2”, age: 20}

4、删除 JSON 的属性

可通过 delete 对 JSON 的属性进行删除。

// 第一种方式:通过 delete 删除const data = { a: 1, b: 2, c: 3, d: 4};delete data.c;delete data[‘d’];console.log(data); // {a: 1, b: 2}// 第二种方式:通过 JSON.stringify() 的特性删除const data = { a: 1, b: 2, c: 3, d: 4};data.c = undefined;data[‘d’] = undefined;const newData = JSON.parse(JSON.stringify(data))console.log(newData); // {a: 1, b: 2}

5、嵌套 JSON 对象

myObj = { “name”:””, “age”:18, “like”: { “fruit1″:”banner”, “fruit2″:”orange”, “fruit3″:”apple” }}

6、遍历 JSON 对象

// 1、for…in…const myObj = { “name”:”kevin”, “age”:18, “sex”:”男” };for (key in myObj) { console.log(key, myObj[key]);}/*name kevinage 18sex 男*/// 2、Object.getOwnPropertyNames(obj).forEach(myObj)const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };Object.getOwnPropertyNames(myObj).forEach(function(key){ console.log(key, myObj[key]);})/*name kevinage 18sex 男*/// 3、Reflect.ownKeys(obj).forEach(myObj)const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };Reflect.ownKeys(myObj).forEach(function (key) { console.log(key, myObj[key]);})/*name kevinage 18sex 男*/// 4、Object.keys(obj).forEach(myObj)const myObj = { “name”:”kevin”, “age”:18, “sex”:”男” };Object.keys(myObj).forEach(key => { console.log(key, myObj[key]);})/*name kevinage 18sex 男*/// 5、JSON.parse(JSON.stringify(myObj)const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };JSON.parse(JSON.stringify(myObj), (key, value) => { console.log(key, value) return value});/*name kevinage 18sex 男{name: “kevin”, age: 18, sex: “男”}*/// 6.1、Object.values(obj).forEach()const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };Object.values(myObj).forEach(function(value){ console.log(value);})/*kevin18男*/// 6.2、Object.keys(obj)const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };console.log(Object.keys(myObj));/*[“name”, “age”, “sex”]*/// 6.3、Object.values(obj)const myObj = { “name”: “kevin”, “age”: 18, “sex”: “男” };console.log(Object.values(myObj));/*[“kevin”, 18, “男”]*/

7、JSON 对象 API 的使用场景

场景一:

实际开发中,有时怕影响原数据,我们就需要深拷贝出一份数据做任意操作,其实使用JSON.stringify() 与 JSON.parse() 来实现深拷贝。

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

场景二:

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

// 判断数组是否包含某对象const data = [ {name:’Kevin1′}, {name:’Kevin2′}, {name:’Kevin3′},];const val = {name:’Kevin3′};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

场景三:

在实际开发中,有时需要在 JSON 对象中包含函数,但 JSON.stringify() 序列化时会将其 key 和 value 忽略掉。我们可以将函数转换为字符串存储,读取时再通过 eval() 方法将其还原。

// 我们可以在执行 JSON.stringify() 函数前将函数转换为字符串来避免以上问题的发生:var obj = { “name”:”Kevin”, “fn”:function () {return { age: 18 };}};obj.fn = obj.fn.toString();var myJSON = JSON.stringify(obj);var obj = JSON.parse(myJSON);obj.fn = eval(“(” + obj.fn + “)”);console.log(obj);/* 输出{ fn: f(), name: “Kevin”}*/

场景四:

需要删除 JSON 对象中的某个元素的时候,通过 JSON.stringify() 的会忽略 值为 undefined 的 key 和 value 特性进行删除,然后使用 JSON.parse() 将其转换会 JSON 对象。

const data = { a: 1, b: 2, c: 3, d: 4};data.c = undefined;data[‘d’] = undefined;const newData = JSON.parse(JSON.stringify(data))console.log(newData); // {a: 1, b: 2}

场景五:

JSON 对象在实际开发中非常常见,就不免的需要判断对象是否为空。我们可以通过 JSON.stringify() 是否等于 “{}” 来实现;还可以先将 JSON 对象遍历成数组,再判断该数组的长度;当然还可以使用 for 循环的方式。

// 1、JSON.stringify() 的方式const data = {}console.log(JSON.stringify(data) === “{}”); // true// 2、遍历成数组的方式const myObj = {};console.log(Object.keys(myObj).length); // 0const myObj = {};console.log(Object.values(myObj).length); // 0const myObj = {};console.log(Object.getOwnPropertyNames(myObj).length); // 0const myObj = {};console.log(Reflect.ownKeysObject.values(myObj).length); // 0

场景六:

在使用 JSON 对象的过程中,有时我们需要对 JSON 对象的值有排序的效果,如果这个 JSON 对象是包裹于数组中,则可以通过 sort() 来排序,但排序的属性需是 number 或 number 的字符串类型。非 number 的字符串排序可以通过 localeCompare()、charCodeAt() 来排序,但 charCodeAt() 方法需要指定第几个字符,不是很方便。纯 JSON 对象的排序好像没有没事必要,因为对象是无序的,如果想排序就只能转换为数组对象排好序再转回 JSON 对象了。

// 排序之前var data = [ { name: ‘user2’, id: 3 }, { name: ‘user3’, id: ‘6’ }, { name: ‘user1’, id: ‘1’ }];console.log(data);// [{name: ‘user2’, id: 3}, {name: ‘user3’, id: ‘6’}, {name: ‘user1’, id: ‘1’}]// 排序之后// 第一种方式:data.sort(function (a, b) { return a.id – b.id})console.log(data);// [{name: “user1”, id: ‘1’}, {name: “user2”, id: 3}, {name: “user3”, id: ‘6’}]// 扩展部分:// 第二种方式:// 根据汉字首字母排序 localeCompare() 是js内置方法data.sort((a, b) => b.name.localeCompare(a.name, ‘zh’)); //z~a 排序data.sort((a, b) => a.name.localeCompare(b.name, ‘zh’)); //a~z 排序console.log(data);// [{name: “user1”, id: ‘1’}, {name: “user2”, id: 3}, {name: “user3”, id: ‘6’}]// 第三种方式:// 根据英文排序 比较 首字母ASCLL码data.sort((a, b) => b.name.charCodeAt(0) – a.name.charCodeAt(0)); //z~a 排序data.sort((a, b) => a.name.charCodeAt(4) – b.name.charCodeAt(4)); //a~z 排序// 或(动态获取’name’字段的长度) data.sort( (a, b) => a.name.charCodeAt(‘name’.length) – b.name.charCodeAt(‘name’.length)); //a~z 排序console.log(data);// [{name: “user1”, id: ‘1’}, {name: “user2”, id: 3}, {name: “user3”, id: ‘6’}]

场景七:

使用 localStorage 和 sessionStorage 缓存数据时,因为它们只能存储字符串,当我们需要缓存对象时,就可以使用 JSON.stringify() 来序列化成字符串再存储,而读取时可以使用 JSON.parse() 来还原回 JSON 对象。

// 存储window.localStorage.setItem(key, JSON.stringify(object));// 读取JSON.parse(window.localStorage.getItem(key));

场景八:

想在路由(浏览器地址)上将对象作为参数传递时,可以使用 JSON.stringify() 来序列化成字符串再传递。

var object = {name: ‘kevin’, age: 18};var url = ‘http://blogif.cn?query=’ + JSON.stringify(object);

场景九:

可以利用 JSON 的 key 具有唯一性的特性,和 JSON.parse() 可以将有效的 JSON 字符串转化为对应的对象或值实现数组的特性实现去重效果。

var arr = [‘a’, ‘b’, ‘c’, ‘a’]console.log(‘000’, arr); // 000 [ ‘a’, ‘b’, ‘c’, ‘a’ ]var arr2 = []arr.forEach(item => { arr2[JSON.stringify(item)] = item})console.log(‘111’, arr2); // 111 [ ‘”a”‘: ‘a’, ‘”b”‘: ‘b’, ‘”c”‘: ‘c’ ]var arr3 = []Object.keys(arr2).forEach(key => { arr3.push(JSON.parse(key));})console.log(‘222’, arr3); // 222 [ ‘a’, ‘b’, ‘c’ ]

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月28日
下一篇 2022年6月28日

相关推荐

  • 如何瘦腿最快最有效女生(瘦小腿5个动作最简单)

    美女当然不希望有小象腿或者萝卜腿, 都想掌握瘦小腿的方法,拥有迷人曲线的小腿。 但是如何选择快速瘦小腿的方法呢? 小编为大家总结了一些快速瘦小腿的方法。 1.打松结实的小腿肌肉 平…

    2022年4月19日
  • 记一次 vue3 数组不响应问题的排查,对象也有可能不响应

    最近在编程时,遇到了 vue3 数组更新却没有响应的问题,解决后,决定把对这次的问题总结记录下来。 代码重现 项目的代码太复杂了,我做了一个超精简版本的重现代码: {{ data.…

    2022年6月14日
  • 华为云重磅发布《金融云原生2.0发展应用白皮书》

    8月18日, 2022金融洞察力峰会在北京成功举行,华为云受邀发表了《云原生,释放金融新生产力》的主题演讲,并发布了《金融云原生2.0发展应用白皮书》。华为云在会上表示,数字化转型…

    2022年8月20日
  • 《半条命:艾利克斯》发布新Mod“Incursion”

    近日,《半条命:艾利克斯》发布了一个新的Mod“Incursion”,增加了由随机生成敌人和波次敌人组成的一小时战役内容。 开发者将“Incursion”描述为“具有非线性目标的长…

    2022年8月2日
  • @ConfigurationProperties注解的使用

    在做项目的时候需要使用代码实现读取properties文件内容,使用@value(name=”xxx”)去读取,但是当参数变多的时候,通过@value操作就…

    2022年6月14日
  • 续航620km、或实现无人驾驶,静态体验威马W6

    在智能化时代,汽车也逐渐成为了智能产品,不仅在智慧车联方面更加智能化、人性化,智能驾驶辅助也让出行更加轻松。目前市面上不少智能汽车,在车联方面已经不输于人们常用的智能手机了,而智能…

    2022年6月24日
  • 银行定存年利率达4.5%,却无人问津?现在的储户都不看重利息了?

    很多中国人都喜欢把钱存入银行当中的,因为中国人的存钱意识是非常强的,尤其是老一辈的,他们更是愿意把钱存入到银行当中,毕竟可以获得一定的利息,而且自己的资金安全也能够得到保障,也正是…

    2022年8月6日
  • 如何高效远程控制电脑?国民远控向日葵值得一试

    当我们面临什么情况时,需要远程控制电脑? 或许是疫情因素导致我们居家远程办公;或许是下班之后突然需要远程存取一些工作文件;又或许是女同学倾慕你高超的计算机知识,需要你远程帮助她处理…

    2022年8月3日
  • 司法考试难吗?

    会者不难,难者不会。 之所以这样说,本人是2016年首次参加司法考试轻松通过。而且参加考试时,是考场中为数不多的头发已经白了很多的中年大叔。进考场后,意外发现坐在后排的是本单位的一…

    2022年4月14日
  • 经济日报携手京东发布数据-水饮市场 健康是关键

    数据来源 京东消费及产业发展研究院 “喝水”日益精细化 “喝水”看似是件小事,背后却隐藏着巨大的消费市场。目前,水饮行业延续了蓬勃发展态势,由消费需求带动的产品创新驱动整个行业持续…

    2022年8月14日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息