`JSON.stringify`省略了数组中的自定义键

时间:2019-03-30 06:28:40

标签: javascript arrays json stringification

我将数组存储为数组和对象的混合物。例如,假设这一点:

let arrObj = [];
arrObj["x"] = 12;
arrObj.push(12);
arrObj["y"] = 15;
arrObj.push(15);

// result: arrObj = [12, 15, x: 12, y: 15]

这样,即使使用12arrObj[0],我也可以访问值arrObj["x"]。这样,我可以对此重复一遍。

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

JSON.stringify(arrObj)
// result: "[12,15]"

我应该如何维护这些键及其值?

3 个答案:

答案 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);

仅供参考:,但是对键值对数据使用ObjectMap总是更好,但我认为这是正确的方法。


更新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?