如何改变JSON中字段的顺序

场景 :考虑我有一个JSON文档,如下所示:

{ "name": "David", "age" : 78, "NoOfVisits" : 4 } 

问题:我想改变文档中字段的顺序/顺序,比如说我想要ageNoOfVisits ,然后是最后的name

截至目前我正在存储在临时variables的值,删除字段&重新创build相同的字段。 由于重新分配没有工作:(

我以下面的方式做了:

  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文档。 这个要求是奇特的,但我仍然需要一些有效的解决scheme

问题 :有人可以用有效的方法帮助实现吗?

也许你可以改变这个使用JSON.stringify()

喜欢

 var json = { "name": "David", "age" : 78, "NoOfVisits" : 4 }; console.log(json); //outputs - Object {name: "David", age: 78, NoOfVisits: 4} //change order to NoOfVisits,age,name var k = JSON.parse(JSON.stringify( json, ["NoOfVisits","age","name"] , 4)); console.log(k); //outputs - Object {NoOfVisits: 4, age: 78, name: "David"} 

把你想要的键顺序放在一个数组中并提供给函数。 然后将结果parsing回json。 这里是一个样品小提琴 。

对象没有特定的顺序。


更新:

ES3规格

一个ECMAScript对象是一个无序的属性集合

ES5规格

没有指定枚举属性的机制和顺序(第一个algorithm中的步骤6.a,第二个步骤中的步骤7.a)。

被列举的对象的属性可能会在枚举过程中被删除。 如果枚举过程中尚未访问的属性被删除,则不会被访问。 如果在枚举过程中将新属性添加到枚举对象中,则新增属性不保证在活动枚举中被访问。 枚举中不得多次访问属性名称。


然而。 如果你想依靠V8的实现顺序。

记住这一点。

迭代一个Object时,V8迭代如下

  1. 数字属性按升序排列。 (虽然不能保证)
  2. 按插入顺序的非数字属性。

如下例所示

 var a = {c:0,1:0,0:0}; ab = 0; a[3] = 0; a[2] = 0; for(var p in a) { console.log(p)}; 

给出输出

  1. 0
  2. 1
  3. 2
  4. 3
  5. b
  6. C

如果你想保证订单…

您不得不使用两个单独的数组(一个用于键,另一个用于值),或者构build一个单属性对象数组等等。

(MDN)

尽pipe同意所有的评论和答案JS没有定义的对象的属性的顺序,我发现自己有一个类似的问题,所以我会尝试回答你的问题:

  function reorder (order, obj) { typeof order === 'string' && (order = order.split (/\s*,\s*/)); return order.reduce (function (rslt, prop) { rslt[prop] = obj[prop]; return rslt; }, {}); } reorder ("age,noOfVisits,name", {name: "David", age: 78, noOfVisits: 4}); 

它也可能用于复制或从对象中提取属性的一个子集。

注意:我的问题需要按照预定义的顺序处理属性,而这个function也提供了这样做的基础。

ECMA-262不指定枚举顺序。 事实上的标准是匹配V8的插入顺序,但有一个例外:V8不能保证数组索引的枚举顺序(即可以parsing为32位无符号整数的属性名称)。

你的解决scheme是有效的,这是在node.js中做到这一点的唯一方法,而不是直接删除和插入新的属性:

 var previous = { "name": "David", "age" : 78, "NoOfVisits" : 4 }; var o = {}; o.age = previous.age; o.NoOfVisits = previous.NoOfVisits; o.name = previous.name; 

我还没有testing,如果干脆

 var o = { age: previous.age, NoOfVisits: previous.NoOfVisits, name: previous.name }; 

也是有效的。

就JSON而言,没有顺序,与每个对象都有一个索引的数组不同。 如果你想要一个特定的顺序,你需要做这样的事情把它变成一个数组:

 var contact = { "name": "David", "age" : 78, "NoOfVisits" : 4 } var arrcontact=[contact.age, contact.NoOfVisits, contact.name] 

但在这样做,你错过了JSON的点

正如已经指出的那样, JavaScript对象的属性没有保证的顺序 (想一想, 有没有什么意义)?

如果您确实需要订购,可以使用以下数组:

 [{"name" : "Dave"}, {"age" : 78}, {"NoOfVisits" : 4}] 

要么:

 ["Dave", 78, 4] // but here you have no idea what is happening 

我不想在我的代码中看到这些。 所以更好的想法是重新思考你想达到的目标。