NodeJS 如何更改JSON中字段的顺序

628mspwn  于 2023-03-01  发布在  Node.js
关注(0)|答案(7)|浏览(190)
    • 情景**:假设我有一个JSON文档,如下所示:
{
     "name": "David",
     "age" : 78,
     "NoOfVisits" : 4
   }

问题:我想更改文档中字段的序列/顺序,比如我想要ageNoOfVisits,最后是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文档。这个需求很特殊,但我仍然需要一些有效的解决方案

    • 问题**:有人能用有效的方法来帮助实现同样的目标吗?
nhhxz33t

nhhxz33t1#

您可以使用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"}

把你想要的键顺序放入一个数组并提供给函数.然后把结果解析回json.这里是一个sample fiddle .

2izufjch

2izufjch2#

    • 对象没有特定顺序。**

更新:

ES3 Specs
ECMAScript对象是无序的属性集合
ES5规格
枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个算法中的步骤7.a)未指定。
正在枚举的对象的属性可以在枚举过程中删除。如果删除了在枚举过程中尚未访问的属性,则将不会访问该属性。如果在枚举过程中向正在枚举的对象添加了新属性,则不保证在活动枚举中访问新添加的属性。在任何枚举中访问属性名称的次数不得超过一次。
然而,如果你想依赖V8的实现顺序。
记住这一点。
当遍历一个Object时,V8的遍历过程如下
1.数值属性按升序排列。(但不保证)
1.按插入顺序排列的非数字特性。
如以下example所示

var a = {c:0,1:0,0:0};

a.b = 0;
a[3] = 0;
a[2] = 0;

for(var p in a) { console.log(p)};

给出输出
1.无

  1. 1个
    1.第二章
    1.三个
  2. b.人口基金
    1.(c)秘书长的报告
    如果你想要保证订单...
    您必须使用两个单独的数组(一个用于键,另一个用于值),或者构建一个单属性对象的数组,等等。
    (马里)
bfhwhh0e

bfhwhh0e3#

尽管同意所有的评论和答案,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});

它还可以用于从对象复制或提取特性子集。
注意:我的问题需要按照预定义的顺序处理属性,而这个函数也提供了这样做的基础。

bejyjqdl

bejyjqdl4#

ECMA-262没有指定枚举顺序。事实上的标准是匹配插入顺序,V8也这样做,但有一个例外:V8没有保证数组索引的枚举顺序(例如,可以解析为32位无符号整数的属性名)。
您的解决方案是有效的,这是在node.js中执行此操作的唯一方法,但您可以直接执行以下操作,而不是删除和插入新属性:

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

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

我还没有测试过如果简单地

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

同样有效。

wnavrhmk

wnavrhmk5#

在JSON中,没有顺序,不像数组中的每个对象都有一个索引。如果你想要一个特定的顺序,你需要做一些类似这样的事情来把它变成一个数组:

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

但是在这样做时,您忽略了JSON的要点

mec1mxoz

mec1mxoz6#

如前所述,JavaScript object properties have no guaranteed order(想一想,拥有一个有意义吗?)
如果你真的需要一个顺序,你可以使用一个数组:

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

或:

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

我不希望在我的代码中看到这些。因此,更好的办法是重新思考您要实现的目标。

vdgimpew

vdgimpew7#

let jsonArray = [{name:"David",age:78,NoOfVisits:4,otherProp:"foobar"},{name:"Joseph",age:22,NoOfVisits:16,otherProp:"foobar"}];

jsonArray = jsonArray.map(i => ({age:i.age,NoOfVisits:i.NoOfVisits,name:i.name,...i}))

console.log(jsonArray)

注意不要在循环中执行此操作,以防止性能问题。

相关问题