我将数组存储为数组和对象的混合物。例如,假设这一点:
let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);
// result: arrObj = [12, 15, x: 12, y: 15]
这样,即使使用12
和arrObj[0]
,我也可以访问值arrObj["x"]
。这样,我可以对此重复一遍。
但是当我对其进行字符串化时,键x
和y
会丢失:
JSON.stringify(arrObj)
// result: "[12,15]"
我应该如何维护这些键及其值?
答案 0 :(得分:3)
在进行字符串化时,使用spread syntax将其转换为对象,然后解析并使用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或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);
UPDATE 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 :(得分:0)
数组应仅包含数字索引值。如果除了值还需要键,请使用一个对象:
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));
答案 2 :(得分:0)
这是一个花哨的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?