11

我有一个在加载页面时启动的 JSON 对象,如下所示:

data[foo] = bar;
data[foo2] = bar2;
data[foo3] = bar3;

有没有办法在第一个元素之前注入一个foo元素,以便在执行 a 时for var i in data,新元素将在对象启动时添加的元素之前循环遍历?

原因是,我正在向用户显示一些项目。当用户通过javascript添加一个新项目时,我希望这个新项目显示在所有现有项目之上,但是当我添加新项目时,即

data[newItem] = newItem;

然后 JSON 对象如下所示:

data[foo] = bar;
data[foo2] = bar2;
data[foo3] = bar3;
data[newItem] = newItem;

而不是我想要的,这是:

data[newItem] = newItem;
data[foo] = bar;
data[foo2] = bar2;
data[foo3] = bar3;

有任何想法吗?

4

6 回答 6

16

在 JS 中,不保证对象属性的顺序。因此,即使它们在 JSON 字符串中是有序的,当被解析为 JS 对象时,你永远无法预测它们以什么顺序出现。

最好改用数组。您可以使用该unshift()方法将项目放在第一个索引中。

var data = [bar,bar2,bar3];

data.unshift(newItem);

//data = [newItem,bar,bar2,bar3];
于 2012-05-27T12:03:17.797 回答
8

作为对Joseph the Dreamer回答的补充,我在 Firefox 和 chrome 中进行了一些快速检查。

火狐:

var obj = {};

obj.a = 'a';
obj.c = 'c';
obj.b = 'b';
obj['0'] = '0';

for(var i in obj){
    console.log(i);
}

//prints:
a
c
b
0

铬合金:

var obj = {};

obj.a = 'a';
obj.c = 'c';
obj.b = 'b';
obj['0'] = '0';

for(var i in obj){
    console.log(i);
}

//prints:
0
a
c
b
于 2012-05-27T12:12:13.607 回答
5

我偶然发现了这一点并使用以下方法实现了它:

const newObject = Object.assign({first: value}, oldObject)

如前所述,不能保证订单,但对我来说这已经足够了。:)

于 2017-02-21T16:51:44.280 回答
3

有没有办法在第一个 foo 元素之前注入一个元素?

数组中的第一个:

window.object 还是 window.alert?

两者都没有,对象没有顺序。如果你想要一个数组,请使用一个数组。对象不是数组。

如果你想

var ThingsInOrder = [
  FirstThing,
  SecondThing,
  ThirdThing
];
ThingsInOrder.push(ForthThing);

使用数组。

如果你想:

var ThingsNeverInOrder = {
  Window,
  Alert,
  Derp,
  Herp
};

ThingsNeverInOrder.foo = bar;

使用一个对象。

于 2012-05-27T12:07:21.960 回答
0

Instead of adding new value in the same object, you can create a new object and arrange properties order as you want. example :

var objj1 = {name:'viru',lastname:'nehra'};

So create a new object with new property which you want on top:

var obj2 = {age: 21}

and the run:

for(var key in objj1){
   obj2[key] = objj1[key]
}

obj2 = {age: 21, name: "viru", lastname: "nehra"}
于 2017-09-11T06:34:43.460 回答
-3

我认为您可以将其转换为字符串,将数据附加到字符串的开头,然后使用“eval”将字符串重新转换为 json

于 2012-05-27T12:05:54.517 回答