我正在尝试将2个对象合并为1个对象而不更改顺序。
例如:
obj1 = {"-":"-","<1":"test"};
obj2 = {"1":"1","2":"2"};
我想要生成的输出:
obj3 = {"-":"-","<1":"test","1":"1","2":"2"};
我尝试过使用:
extend =&gt;差不多,某种程度上obj1被放在obj2之后所以它变成了这样:
obj3 = {"1":"1","2":"2","-":"-","<1":"test"};
合并而不将obj1和obj2更改为array =&gt;失败,它只返回我obj1
result=$.merge( obj1, obj2 );
合并首先将obj1和obj2更改为array =&gt;失败,它变成了对象数组
这里的小启示?提前谢谢。
更新:
这是我的代码:
obj2 = {};
obj1 = {"-":"-","<1":"test"};
for(x = 1;x<=2;x++){
obj2[x] = x;
}
obj3 = $.extend(obj1, obj2);
return obj3;
显然,当我们在控制台中打印obj3时,它打印为:
obj3 = {"1":"1","2":"2","-":"-","<1":"test"};
但实际上,当你在另一个函数中处理obj3返回时,顺序仍然如下:
{"-":"-","<1":"test","1":"1","2":"2"};
有趣......好问题解决了。谢谢!每个人都获得+1
答案 0 :(得分:1)
由于未订购对象,因此无法执行此操作。如果你真的,真的, 真的 需要订购,你可以使用带键/值对的数组作为单独的元素。
例如:
var x = ['key', 'value', 'otherkey', 'othervalue'];
var y = ['ykey', 'yvalue'];
var z = x.concat(y);
当然,有了这个,你想要一些实用功能:
Array.prototype.to_object = function() {
if(this.length % 2 != 0) {
//uneven, abort.
return null;
}
var obj = {};
for(var i = 0, j = this.length; i < j; i += 2) {
obj[this[i]] = this[i+1];
}
return obj;
};
Object.prototype.to_keyed_array = function() {
if(this instanceof Array) return null;
var array = [];
var i = 0;
for(var k in this) {
if(this.hasOwnProperty(k)) {
array[i] = k;
array[i+1] = this[k];
i += 2;
}
}
return array;
};
注意:这些功能同样不保证从对象转换为Array
时的排序,反之亦然。他们唯一的目的是为你提供两种范式之间的桥梁。
示例:
['k1', 'v1', 'k2', 'v2'].to_object(); //-> {'k1': 'v1', 'k2':'v2'}