如何改变JSON中字段的顺序
场景 :考虑我有一个JSON文档,如下所示:
{ "name": "David", "age" : 78, "NoOfVisits" : 4 }
问题:我想改变文档中字段的顺序/顺序,比如说我想要age
, NoOfVisits
,然后是最后的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迭代如下
- 数字属性按升序排列。 (虽然不能保证)
- 按插入顺序的非数字属性。
如下例所示
var a = {c:0,1:0,0:0}; ab = 0; a[3] = 0; a[2] = 0; for(var p in a) { console.log(p)};
给出输出
- 0
- 1
- 2
- 3
- b
- 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
我不想在我的代码中看到这些。 所以更好的想法是重新思考你想达到的目标。