如何在jQuery中没有重新索引的情况下将2个对象合并为1个对象

时间:2011-10-19 10:11:29

标签: jquery

我正在尝试将2个对象合并为1个对象而不更改顺序。

例如:

obj1 = {"-":"-","<1":"test"};    
obj2 = {"1":"1","2":"2"};

我想要生成的输出:

obj3 = {"-":"-","<1":"test","1":"1","2":"2"};    

我尝试过使用:

  • 添加&amp; concat =&gt;失败,因为它生成了一个对象数组
  • 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

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'}