网络知识 娱乐 JSON 对象的这些操作和使用场景你知道多少?

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

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

1、添加 JSON 的属性

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

const data = {};n// 第一种方式:ndata.name = "kevin";n// 第二种方式:ndata['age'] = 18;nconsole.log(data); // {name: "kevin", age: 18}


2、访问 JSON 的值

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

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


3、修改 JSON 的值

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

const data = {n name: "kevin",n age: 18n};n// 第一种方式:ndata.name = "kevin2";n// 第二种方式:ndata['age'] = 20;nconsole.log(data); // {name: "kevin2", age: 20}


4、删除 JSON 的属性

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

// 第一种方式:通过 delete 删除nconst data = {n a: 1,n b: 2,n c: 3,n d: 4n};ndelete data.c;ndelete data['d'];nconsole.log(data); // {a: 1, b: 2}nnn// 第二种方式:通过 JSON.stringify() 的特性删除nconst data = {n a: 1,n b: 2,n c: 3,n d: 4n};ndata.c = undefined;ndata['d'] = undefined;nconst newData = JSON.parse(JSON.stringify(data))nconsole.log(newData); // {a: 1, b: 2}


5、嵌套 JSON 对象

myObj = {n "name":"",n "age":18,n "like": {n "fruit1":"banner",n "fruit2":"orange",n "fruit3":"apple"n }n}


6、遍历 JSON 对象

// 1、for...in...nconst myObj = { "name":"kevin", "age":18, "sex":"男" };nfor (key in myObj) {n console.log(key, myObj[key]);n}n/*nname kevinnage 18nsex 男n*/nn// 2、Object.getOwnPropertyNames(obj).forEach(myObj)nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nObject.getOwnPropertyNames(myObj).forEach(function(key){n console.log(key, myObj[key]);n})n/*nname kevinnage 18nsex 男n*/nn// 3、Reflect.ownKeys(obj).forEach(myObj)nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nReflect.ownKeys(myObj).forEach(function (key) {n console.log(key, myObj[key]);n})n/*nname kevinnage 18nsex 男n*/nn// 4、Object.keys(obj).forEach(myObj)nconst myObj = { "name":"kevin", "age":18, "sex":"男" };nObject.keys(myObj).forEach(key => {n console.log(key, myObj[key]);n})n/*nname kevinnage 18nsex 男n*/nn// 5、JSON.parse(JSON.stringify(myObj)nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nJSON.parse(JSON.stringify(myObj), (key, value) => {n console.log(key, value)n return valuen});n/*nname kevinnage 18nsex 男n{name: "kevin", age: 18, sex: "男"}n*/nn// 6.1、Object.values(obj).forEach()nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nObject.values(myObj).forEach(function(value){n console.log(value);n})n/*nkevinn18n男n*/nn// 6.2、Object.keys(obj)nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nconsole.log(Object.keys(myObj));n/*n["name", "age", "sex"]n*/nn// 6.3、Object.values(obj)nconst myObj = { "name": "kevin", "age": 18, "sex": "男" };nconsole.log(Object.values(myObj));n/*n["kevin", 18, "男"]n*/


7、JSON 对象 API 的使用场景

场景一:

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

// 深拷贝nfunction deepClone(data) {n return JSON.parse(JSON.stringify(data));n};n// 测试nlet arr = [1,2,3],n _arr = deepClone(arr);narr[0] = 2;nconsole.log(arr, _arr); // [2, 2, 3] [1, 2, 3]

场景二:

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

// 判断数组是否包含某对象nconst data = [n {name:'Kevin1'},n {name:'Kevin2'},n {name:'Kevin3'},n];nconst val = {name:'Kevin3'};nJSON.stringify(data).indexOf(JSON.stringify(val)) !== -1; // truenn//判断两数组/对象是否相等nlet a = [1,2,3],n b = [1,2,3];nJSON.stringify(a) === JSON.stringify(b); // true

场景三:

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

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

场景四:

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

const data = {n a: 1,n b: 2,n c: 3,n d: 4n};ndata.c = undefined;ndata['d'] = undefined;nconst newData = JSON.parse(JSON.stringify(data))nconsole.log(newData); // {a: 1, b: 2}

场景五:

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

// 1、JSON.stringify() 的方式nconst data = {}nconsole.log(JSON.stringify(data) === "{}"); // truenn// 2、遍历成数组的方式nconst myObj = {};nconsole.log(Object.keys(myObj).length); // 0nnconst myObj = {};nconsole.log(Object.values(myObj).length); // 0nnconst myObj = {};nconsole.log(Object.getOwnPropertyNames(myObj).length); // 0nnconst myObj = {};nconsole.log(Reflect.ownKeysObject.values(myObj).length); // 0

场景六:

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

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

场景七:

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

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

场景八:

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

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

场景九:

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

var arr = ['a', 'b', 'c', 'a']nconsole.log('000', arr); // 000 [ 'a', 'b', 'c', 'a' ]nvar arr2 = []narr.forEach(item => {n arr2[JSON.stringify(item)] = itemn})nconsole.log('111', arr2); // 111 [ '"a"': 'a', '"b"': 'b', '"c"': 'c' ]nvar arr3 = []nObject.keys(arr2).forEach(key => {n arr3.push(JSON.parse(key));n})nconsole.log('222', arr3); // 222 [ 'a', 'b', 'c' ]