`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。这样,我就可以重复一遍了。

但是当我对它进行字符串化时,键 xy 丢失了:

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?