我有JSON数据
var json = {"options": {
"key1": "value2",
"key2": "value2",
"key3": "value3",
}
}
我想使用JavaScript添加一个有价值的密钥,但是我想让它像这样在顶部:
var json = {"options": {
"new_key": "new_value",
"key1": "value2",
"key2": "value2",
"key3": "value3",
}
}
我该怎么做?
答案 0 :(得分:4)
对象不保证JavaScript中的属性顺序,但是数组可以。如果订单真的很重要并允许您更改JSON结构,我建议您使用数组来组织数据。
var json = {
"options": [
{"key": "key1", "value": "value1"},
{"key": "key2", "value": "value2"},
{"key": "key3", "value": "value3"}
]
};
使用此方法,您可以使用unshift
方法将元素推送到数组的开头。
json.options.unshift({"key": "new_key", "value": "new_value"});
答案 1 :(得分:3)
虽然任何ECMAScript规范都不要求它,但是大多数实现都保留了对象中原始的键顺序,但带有数值的键除外。您可以在此处查看有关Chrome实施的冗长讨论:http://code.google.com/p/v8/issues/detail?id=164
如果要使用它,则需要创建一个新对象:
var newOpts = {};
newOpts["new_key"] = "new_value";
for (var k in json.options) {
newOpts[k] = json.options[k];
}
json.options = newOpts;
但是,如果您实际上将对象转换为JSON字符串并将其发送给其他人,无法保证在将字符串解析回Object时保留顺序。
我很惊讶地发现广泛使用的NodeJS Express库实际上依赖于format
方法的这种行为。
答案 2 :(得分:1)
JSON对象没有订单。 如果订单对您很重要,请考虑将选项创建为数组,然后您可以按特定顺序迭代和添加项目:
var json = {"options": [
{key: "new_key", value: "new_value"},
{key: "key1", value: "value2"},
{key: "key2", value: "value2"},
{key: "key3", value: "value3"},
]}
答案 3 :(得分:1)
您可以使用vanilla JavaScript以下列方式扩展对象,但同样不会像其他人所说的那样设置顺序。
extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
};
var json = {
"options": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
};
extend(json.options, {"new_key": "new_value"});
答案 4 :(得分:0)
您可以使用extend function对象的排序将决定首先写入哪些参数,但正如DanFromGermany所述,订单相关的现实案例并不多。