一 、 JSON.stringify()和JSON.parse()的區別;
簡單來說:JSON.stringify()將對象obj變成了字符串str,那麼我就可以用JSON.parse()將字符串str還原成對象obj。
在使用JSON.parse()需要注意一點,由於此方法是將JSON字符串轉換成對象,所以你的字符串必須符合JSON格式,即鍵值都必須使用雙引號包裹;
二、JSON.stringify()的使用;
//1.判斷數組是否包含某對象
var data = [
{name:'魏無羨'},
{name:'藍湛'},
{name:'思追'},
],
name1= {name:'江澄'};
name2={name:'魏無羨'};
JSON.stringify(data).indexOf(JSON.stringify(name1)) !== -1;//false
JSON.stringify(data).indexOf(JSON.stringify(name2)) !== -1;//true
//2.判斷兩數組/對象是否相等
let a = ["魏無羨","藍湛"],
b = ["魏無羨","藍湛"];
JSON.stringify(a) === JSON.stringify(b);//true
//3.sessionStorage 和localStorage 存儲數據只能存儲字符串,需要轉變
function setSessionStorage(key,val){
sessionStorage.setItem(key,JSON.stringify(val)); //存
};
function getSessionStorage(key){
let val = JSON.parse(sessionStorage.getItem(key)); //取
return val;
};
//測試
setSessionStorage('demo',[1,2,3]);
let a = getSessionStorage('demo');//[1,2,3]
//3.實現對象深拷貝
//深拷貝
function deepClone(data) {
return JSON.parse(JSON.stringify(data));
};
三 、JSON.stringify() 的深入瞭解
語法:參考 mdn
JSON.stringify(value[, replacer [, space]])
參數:
value:
將要序列化成 一個JSON 字符串的值。一般傳入一個對象,但是不僅僅如此,還可以傳入其他值。
replacer | 可選
數據過濾處理,可以三種類型的值:
1.函數,在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理
2.數組,只有包含在這個數組中的屬性名纔會被序列化到最終的 JSON 字符串中
3.null或者不提供,象所有的屬性都會被序列化
space | 可選
指定縮進用的空白字符串,用於美化輸出,可以指定三種類型的值:
1.數字,代表有多少的空格。上限爲10,該值若小於1,則意味着沒有空格。
2.字符串,字符串的前十個字母,該字符串將被作爲空格。
3.null或者未提供,將沒有空格。
返回值
一個表示給定值的 json 字符串
參考:
https://www.cnblogs.com/EnSnail/p/11183071.html
//測試代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
var oldData = [{
"coverage": "cover1",
"premium": "10",
"coverageRefs": [{
"name": "mike1",
"insuredId": "1"
},
{
"name": "mike2",
"insuredId": "2"
},
{
"name": "mike3",
"insuredId": "3"
}
]
}
];
var newData = [{
"coverage": "cover1",
"premium": "30",
"coverageRefs": [{
"name": "mike1",
"insuredId": "1"
},
{
"name": "mike2",
"insuredId": "2"
},
{
"name": "mike3",
"insuredId": "3"
}
]
}];
function isCompare(insuredId) {
var oldpremium = 0.00;
var newpremium = 0.00;
var flag = true; //默認相等,保費未做調整
for (var i = 0; i < oldData.length; i++) {
if (JSON.stringify(oldData[i].coverageRefs).indexOf(insuredId) !== -1) {
oldpremium += parseFloat(oldData[i].premium);
} else {
continue
}
}
for (var i = 0; i < newData.length; i++) {
if (JSON.stringify(newData[i].coverageRefs).indexOf(insuredId) !== -1) {
newpremium += parseFloat(newData[i].premium);
} else {
continue
}
}
if (oldpremium == newpremium) {
flag = true
} else {
flag = false
}
return flag;
}
var res = isCompare("3");
var str = JSON.stringify(oldData, ["coverageRefs", "premium"]);
var strs = JSON.stringify(oldData, function (k, v) {
if (k == 'coverage') {
return undefined
} else {
return v;
}
}, 4);
console.log(res);
console.log(JSON.parse(str));
console.log(JSON.parse(strs));
</script>
</head>
<body>
</body>
</html>