- 情景**:假设我有一个JSON文档,如下所示:
{
"name": "David",
"age" : 78,
"NoOfVisits" : 4
}
问题:我想更改文档中字段的序列/顺序,比如我想要age
、NoOfVisits
,最后是name
。
到目前为止,我将值存储在临时变量中,删除字段并重新创建相同的字段。由于重新分配不起作用:(
我是这样做的:
temp = doc["age"];
delete doc['age'];
doc["age"] = temp;
temp = doc["NoOfVisits "];
delete doc['NoOfVisits '];
doc["NoOfVisits"] = temp;
temp = doc["name"];
delete doc['name'];
doc["name"] = temp;
这样我就可以得到所需的有序JSON文档。这个需求很特殊,但我仍然需要一些有效的解决方案
- 问题**:有人能用有效的方法来帮助实现同样的目标吗?
7条答案
按热度按时间nhhxz33t1#
您可以使用
JSON.stringify()
更改此设置喜欢
把你想要的键顺序放入一个数组并提供给函数.然后把结果解析回json.这里是一个sample fiddle .
2izufjch2#
更新:
ES3 Specs
ECMAScript对象是无序的属性集合
ES5规格
枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个算法中的步骤7.a)未指定。
正在枚举的对象的属性可以在枚举过程中删除。如果删除了在枚举过程中尚未访问的属性,则将不会访问该属性。如果在枚举过程中向正在枚举的对象添加了新属性,则不保证在活动枚举中访问新添加的属性。在任何枚举中访问属性名称的次数不得超过一次。
然而,如果你想依赖V8的实现顺序。
记住这一点。
当遍历一个Object时,V8的遍历过程如下
1.数值属性按升序排列。(但不保证)
1.按插入顺序排列的非数字特性。
如以下example所示
给出输出
1.无
1.第二章
1.三个
1.(c)秘书长的报告
如果你想要保证订单...
您必须使用两个单独的数组(一个用于键,另一个用于值),或者构建一个单属性对象的数组,等等。
(马里)
bfhwhh0e3#
尽管同意所有的评论和答案,JS不定义对象属性的顺序,我发现自己有一个有点类似的问题,所以我会尝试回答你的问题:
它还可以用于从对象复制或提取特性子集。
注意:我的问题需要按照预定义的顺序处理属性,而这个函数也提供了这样做的基础。
bejyjqdl4#
ECMA-262没有指定枚举顺序。事实上的标准是匹配插入顺序,V8也这样做,但有一个例外:V8没有保证数组索引的枚举顺序(例如,可以解析为32位无符号整数的属性名)。
您的解决方案是有效的,这是在node.js中执行此操作的唯一方法,但您可以直接执行以下操作,而不是删除和插入新属性:
我还没有测试过如果简单地
同样有效。
wnavrhmk5#
在JSON中,没有顺序,不像数组中的每个对象都有一个索引。如果你想要一个特定的顺序,你需要做一些类似这样的事情来把它变成一个数组:
但是在这样做时,您忽略了JSON的要点
mec1mxoz6#
如前所述,JavaScript object properties have no guaranteed order(想一想,拥有一个有意义吗?)
如果你真的需要一个顺序,你可以使用一个数组:
或:
我不希望在我的代码中看到这些。因此,更好的办法是重新思考您要实现的目标。
vdgimpew7#
注意不要在循环中执行此操作,以防止性能问题。