2012-05-27 77 views
7

我有当页面加载它发起了一个JSON对象,像这样的顶部:添加东西JSON对象

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

有没有办法在第一foo元素之前注入的元素,因此,在执行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; 

任何想法?

+0

[这个话题](HTTP:// stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop)可能是相关的。也就是说:如果订单是相关的,*使用数组。* –

回答

13

在JS中,不保证对象属性的顺序。因此,即使它们是在JSON字符串中进行排序的,但在作为JS对象进行分析时,您将永远无法预测它们出现的顺序。

更好地使用数组。您可以使用unshift()方法将项目放入第一个索引。

var data = [bar,bar2,bar3]; 

data.unshift(newItem); 

//data = [newItem,bar,bar2,bar3]; 
+1

参见http://stackoverflow.com/questions/648139/is-the-order-of-fields-in-a-javascript-object-可预测的当循环通过吨和http://stackoverflow.com/questions/586182/javascript-insert-item-into-array-at-a-specific-index – georgebrock

+0

不是一个选项,我已经编码它作为一个对象。我不得不在一个巨大的地方改变它来使用一个数组。什么是使它作为一个对象工作的方式? –

+0

所以没有办法使用'data [“foo”]'来获取相应的数据。我想知道是否有库模拟Python的OrderedDict在JavaScript中 – wong2

-3

我认为你可以将其转换为字符串,在字符串的开头添加数据,然后再转换为字符串使用“EVAL”

+8

离开键盘。 – Incognito

+0

我试图通过提供见解来提供帮助 –

+0

请研究你为什么不应该使用eval。然后找出为什么你不应该把对象转换成字符串,然后再回来... – Incognito

3

是否有办法注入一到JSON第一个foo元素之前的元素?

以先在阵列中:

window.object或window.alert?

也没有,对象没有订单。如果你想要一个数组,使用一个数组。对象不是数组。

如果你想

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

使用数组。

如果你想:

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

ThingsNeverInOrder.foo = bar; 

使用对象。

8

作为致Joseph the Dreameranswer的补充,我已经在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 
2

我已经在这个偶然发现,并使用它来实现:

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

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

+0

工作完美。 – AnthonyVO

0

而不是在同一个对象中添加新值,您可以创建一个新的对象,并按您的意愿排列属性顺序。 例如:

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

因此,创建新的属性,你想在上面一个新的对象:

var obj2 = {age: 21} 

和运行:

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

obj2 = {age: 21, name: "viru", lastname: "nehra"}