是否可以在ES6(或后续版本),Javascript或TypeScript方法中使用本机(内置)将JSON字符串转换为ES6映射,或者选择要实现的自制解析器?目标是保留JSON字符串编码对象的键顺序。
注意:我故意不使用“ parse”一词来避免首先将JSON字符串转换为ECMA脚本/ JavaScript对象,该对象按照定义没有键的顺序。
例如:
{"b": "bar", "a": "foo" } // <-- This is how the JSON string looks
我需要:
{ b: "bar", a: "foo" } // <-- desired (map version of it)
答案 0 :(得分:1)
更新
https://jsbin.com/kiqeneluzi/1/edit?js,console
我唯一不同的方法是使用正则表达式获取密钥以保持顺序
let j = "{\"b\": \"bar\", \"a\": \"foo\", \"1\": \"value\"}"
let js = JSON.parse(j)
// Get the keys and maintain the order
let myRegex = /\"([^"]+)":/g;
let keys = []
while ((m = myRegex.exec(j)) !== null) {
keys.push(m[1])
}
// Transform each key to an object
let res = keys.reduce(function (acc, curr) {
acc.push({
[curr]: js[curr]
});
return acc
}, []);
console.log(res)
原始
如果我了解您要为选项2达到的目标,这就是我的想法。
https://jsbin.com/pocisocoya/1/edit?js,console
let j = "{\"b\": \"bar\", \"a\": \"foo\"}"
let js = JSON.parse(j)
let res = Object.keys(js).reduce(function (acc, curr) {
acc.push({
[curr]: js[curr]
});
return acc
}, []);
console.log(res)
基本上获取对象的所有键,然后将其还原。 reducer函数将每个键转换为对象的方式
答案 1 :(得分:0)
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
答案 2 :(得分:-2)
用于循环
let map = new Map();
let jsonObj = {a:'a',b:'b',c:'c'}
for (let i in jsonObj){
map.set(i,jsonObj[i]);
}
顺便说一句,我看到了下面的评论,我认为地图没有排序,因为您使用键来获取地图中的数据,而不是索引。