JS не сортировать индексы цифровых объектов - PullRequest
2 голосов
/ 10 июля 2020

При создании такого объекта

let o = {}
o["prop2"] = "val"
o["prop1"] = "val"

Свойства сохраняются в том порядке, в котором они установлены, поэтому при получении ключей объекта (Object.keys(o)) они возвращаются в своих правильный порядок (["prop2", "prop1"]). Этот порядок имеет далеко идущие последствия, так как цикл for...in использует его и, следовательно, он также влияет на JSON.stringify. Я хочу использовать это поведение для оптимизации производительности (например, отправка уже отсортированных объектов, которые легче анализировать).

Однако все это разваливается при использовании индексов numeri c. На первый взгляд похожий объект

let o = {}
o["2"] = "val"
o["1"] = "val"

не подтверждает поведение выше. Здесь Object.keys(o) возвращает ["1", "2"]: (.

Можно ли этого как-то избежать? Без предварительной / последующей фиксации всех свойств?

1 Ответ

1 голос
/ 10 июля 2020

Используйте вместо него Map, чтобы сохранить порядок размещения.

let m = new Map;
m.set("2", "val");
m.set("1", "val");
m.forEach((v,k)=>console.log(k,"=",v));

Чтобы преобразовать его в JSON, вы можете преобразовать записи Map. Вы можете использовать синтаксический анализ строки и передать записи конструктору Map, чтобы преобразовать ее обратно.

const map = new Map([
  ['foo', 10],
  ['baz', 42]
]);
let str = JSON.stringify([...map.entries()])
console.log(str);
new Map(JSON.parse(str)).forEach((v,k)=>console.log(k,"=",v));

Вы можете предоставить обратный вызов JSON .stringify и JSON .parse для преобразования вложенных структур карты.

let m = new Map;
m.set("b", new Map([["c","d"],["e","f"], ["d", new Map([["a", 1]])]]));
let str = JSON.stringify(m, (key,val)=>{
    return Object.prototype.toString.call(val) === '[object Map]' ? [...val.entries()] : val;
});
console.log(str);
let m2 = JSON.parse(str, (key, val)=>{
    return Array.isArray(val) && Array.isArray(val[0]) ? new Map(val) : val;
});
console.log(m2);

Демо: https://jsfiddle.net/ob8d2uLf/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...