`JSON.stringify` 省略数组中的自定义键
`JSON.stringify` omits custom keys in array
我将我的数组存储为一个数组和一个对象的混合体。例如假设这个:
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
// result: arrObj = [12, 15, x: 12, y: 15]
这样,即使使用 arrObj[0]
和 arrObj["x"]
,我也可以访问值 12
。这样,我就可以重复一遍了。
但是当我对它进行字符串化时,键 x
和 y
丢失了:
JSON.stringify(arrObj)
// result: "[12,15]"
我应该如何维护这些键及其值?
数组应仅包含数字索引值。如果除了值之外还需要 keys,请使用对象:
const obj = {};
obj.x = 12;
obj[0] = 12;
obj.y = 15;
obj[1] = 15;
console.log(JSON.stringify(obj));
for (let i = 0; i in obj; i++) {
console.log(obj[i]);
}
您也可以考虑使用包含数组和自定义键值对的对象,例如:
const arr = [];
const obj = { arr };
obj.x = 12;
obj.y = 15;
arr.push(12);
arr.push(15);
console.log(JSON.stringify(obj));
同时使用spread syntax and later parse and use Array#reduce
方法将其字符串化转换为对象以生成数组。
数组保留 属性 因为数组也是 Javascript 中的一个对象。
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
let json = JSON.stringify({ ...arrObj });
console.log(json);
let parsed = Object.entries(JSON.parse(json)).reduce((arr, [key, value]) => (arr[key] = value, arr), []);
console.log(parsed);
仅供参考: 但是对键值对数据使用 Object or Map 总是更好,在我看来这才是正确的方法。
更新 1: 或者您可以使用一个主对象来保留所有额外的 属性 并在其中创建一个 属性 也保留数组。
let arrObj = {
arr: []
};
arrObj["x"] = 12;
arrObj.arr.push(12);
arrObj["y"] = 15;
arrObj.arr.push(15);
let json = JSON.stringify(arrObj);
console.log(json);
let parsed = JSON.parse(json);
console.log(parsed);
更新 2: 如果您尝试将 属性 命名为 arr
,则第二种方法会导致问题(在我的例子中)所以将对象值分开 属性.
let arrObj = {
arr: [],
obj: {}
};
arrObj.obj["x"] = 12;
arrObj.arr.push(12);
arrObj.obj["y"] = 15;
arrObj.arr.push(15);
let json = JSON.stringify(arrObj);
console.log(json);
let parsed = JSON.parse(json);
console.log(parsed);
这是一个奇特的 1 衬垫解决方案:
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
var string = JSON.stringify(Object.keys(arrObj).reduce((acc, cur) => ((acc[cur] = arrObj[cur]), acc), {}));
console.log(string);
P.S:我认为值得一提的是您可能会遇到意外行为,因为在 JS 中,无法保证对象属性是有序的(如您所愿)。
Does JavaScript Guarantee Object Property Order?
我将我的数组存储为一个数组和一个对象的混合体。例如假设这个:
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
// result: arrObj = [12, 15, x: 12, y: 15]
这样,即使使用 arrObj[0]
和 arrObj["x"]
,我也可以访问值 12
。这样,我就可以重复一遍了。
但是当我对它进行字符串化时,键 x
和 y
丢失了:
JSON.stringify(arrObj)
// result: "[12,15]"
我应该如何维护这些键及其值?
数组应仅包含数字索引值。如果除了值之外还需要 keys,请使用对象:
const obj = {};
obj.x = 12;
obj[0] = 12;
obj.y = 15;
obj[1] = 15;
console.log(JSON.stringify(obj));
for (let i = 0; i in obj; i++) {
console.log(obj[i]);
}
您也可以考虑使用包含数组和自定义键值对的对象,例如:
const arr = [];
const obj = { arr };
obj.x = 12;
obj.y = 15;
arr.push(12);
arr.push(15);
console.log(JSON.stringify(obj));
同时使用spread syntax and later parse and use Array#reduce
方法将其字符串化转换为对象以生成数组。
数组保留 属性 因为数组也是 Javascript 中的一个对象。
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
let json = JSON.stringify({ ...arrObj });
console.log(json);
let parsed = Object.entries(JSON.parse(json)).reduce((arr, [key, value]) => (arr[key] = value, arr), []);
console.log(parsed);
仅供参考: 但是对键值对数据使用 Object or Map 总是更好,在我看来这才是正确的方法。
更新 1: 或者您可以使用一个主对象来保留所有额外的 属性 并在其中创建一个 属性 也保留数组。
let arrObj = {
arr: []
};
arrObj["x"] = 12;
arrObj.arr.push(12);
arrObj["y"] = 15;
arrObj.arr.push(15);
let json = JSON.stringify(arrObj);
console.log(json);
let parsed = JSON.parse(json);
console.log(parsed);
更新 2: 如果您尝试将 属性 命名为 arr
,则第二种方法会导致问题(在我的例子中)所以将对象值分开 属性.
let arrObj = {
arr: [],
obj: {}
};
arrObj.obj["x"] = 12;
arrObj.arr.push(12);
arrObj.obj["y"] = 15;
arrObj.arr.push(15);
let json = JSON.stringify(arrObj);
console.log(json);
let parsed = JSON.parse(json);
console.log(parsed);
这是一个奇特的 1 衬垫解决方案:
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
var string = JSON.stringify(Object.keys(arrObj).reduce((acc, cur) => ((acc[cur] = arrObj[cur]), acc), {}));
console.log(string);
P.S:我认为值得一提的是您可能会遇到意外行为,因为在 JS 中,无法保证对象属性是有序的(如您所愿)。 Does JavaScript Guarantee Object Property Order?