在JSON的开头添加新元素

时间:2012-05-21 19:31:18

标签: javascript

我有这个JSON:

var myVar = {
     "9":"Automotive & Industrial",
     "1":"Books",
     "7":"Clothing"
};

我想在开头添加一个新元素,我想最终得到这个:

var myVar = {
     "5":"Electronics",
     "9":"Automotive & Industrial",
     "1":"Books",
     "7":"Clothing"
};

我尝试了这个但是没有用:

myVar.unshift({"5":"Electronics"});

谢谢!

8 个答案:

答案 0 :(得分:10)

根据定义,Javascript对象没有与它们关联的订单,因此这是不可能的

如果您需要订单,则应使用对象数组

var myArray = [
    {number: '9', value:'Automotive & Industrial'},
    {number: '1', value:'Books'},
    {number: '7', value:'Clothing'}
]

然后如果你想在第一个位置插入一些东西,可以使用Arrays的unshift方法。

myArray.unshift({number:'5', value:'Electronics'})

//myArray is now the following
[{number:'5', value:'Electronics'},
 {number: '9', value:'Automotive & Industrial'},
 {number: '1', value:'Books'},
 {number: '7', value:'Clothing'}]

这里有更多细节: Does JavaScript Guarantee Object Property Order?

答案 1 :(得分:2)

无法向JSON添加新条目并控制它们的位置。

如果你想处理订单[奇怪,因为对象是无序的],你必须基本上创建一个新对象并附加数据。

答案 2 :(得分:2)

Javascript对象属性未经确定性排序。无论它们处于何种顺序,都可以访问属性。如果您依赖它们来按for-in循环的特定顺序,我建议您重新考虑您的策略。不同的浏览器将采用不同的方法来排序属性。虽然许多浏览器实际上会按照您创建它们的顺序处理它们,但实际上并未在语言规范中定义该行为,因此您无法依赖它。

答案 3 :(得分:2)

我认为不合时宜的问题可能来自你是一个关联数组。 Definition of associative array

这可能是一个黑客,但如果你必须在JSON对象的开头有这个值,那么:

var myNewVar={'5':'Electronics'};
for (xx in myVar) {
    myNewVar[xx]=myVar[xx];
}

答案 4 :(得分:2)

这可以使用lodash合并功能完成,如下所示:

var myObj = _.merge({ col1: 'col 1', col2: 'col 2'}, { col3: 'col 3', col4: 'col 4' });

您的最终对象将如下所示:

{ col1: 'col 1', col2: 'col 2', col3: 'col 3', col4: 'col 4' }

正如其他人所提到的,无法保证对象中键的顺序将保持不变,具体取决于您使用它的方式。但是,如果您执行合并作为最后一步,那么您应该没问题。注意,'merge'函数将生成一个全新的对象,它不会改变你传递给它的任何对象。

答案 5 :(得分:1)

这样做:

var myVar = {
     "9":"Automotive & Industrial",
     "1":"Books",
     "7":"Clothing"
};

// if you want to add a property, then...

myVar["5"]="Electronics"; // note that it won't be "first" or "last", it's just "5"

答案 6 :(得分:0)

尝试类似的东西:

myObject.sort(function(a,b) { return parseFloat(a.price) - parseFloat(b.price) } );

myObject.sort(function(a,b) { return parseFloat(a.get("price")) - parseFloat(b.get("price")) } );

答案 7 :(得分:0)

字符串化和修改

var foo = {a:1,b:2,c:3};
var bar = JSON.stringify(foo);
foo = JSON.parse('{"d":4,' + bar.slice(1));
alert(JSON.stringify(foo));