`JSON.stringify` пропускает пользовательские ключи в массиве - PullRequest
1 голос
/ 30 марта 2019

Я храню свой массив как смесь массива, массива и объекта. Например, предположим, что это:

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]"

Как мне сохранить эти ключи и их значения?

Ответы [ 3 ]

3 голосов
/ 30 марта 2019

При строковом преобразовании преобразуйте его в объект, используя распространяемый синтаксис и более поздний анализ, и используйте метод Array#reduce для генерации массива.

Массив сохраняет свойство, поскольку Array также является объектом в 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);

К вашему сведению: Но всегда лучше использовать Объект или Карта для данных пары ключ-значение, но не лучше, на мой взгляд, это правильный путь.


ОБНОВЛЕНИЕ 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);
0 голосов
/ 30 марта 2019

Вот причудливое решение с 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);

PS: я подумал, что стоит упомянуть, что вы можете столкнуться с неожиданным поведением, потому что в JS нет гарантии, что свойства объекта упорядочены (как вы хотели). Гарантирует ли JavaScript порядок объекта недвижимости?

0 голосов
/ 30 марта 2019

Массивы должны содержать только числовые значения.Если вы хотите ключи в дополнение к значениям, используйте объект:

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));
...