在JS中组合关联数组/对象而不擦除数字索引值$ .extend()

时间:2017-09-04 22:10:54

标签: javascript jquery

使用$.extend(true, {}, obj1, obj2)时,生成的对象会删除任何数字索引数据,直至obj2中的结果数。

$.extend()的示例调用如下:

然后以此示例数据为例:

 var base_json_obj = {
    'regions': [
   'NC',
    '-Greensboro',
    'VA',
    '-Richmond'
  ],
  'vehicles': [
    'Ford:Escape',
    'Nissan:Altima'
  ],
  'turnover': {
    'min': '0d',
    'max': '5d'
  }
 };

 var new_json_obj = {
    'regions': [
    'FL',
    '-Miami'
  ],
  'vehicles': [
    'Hyundai:Sonata'
  ],
  'turnover': {
    'min': '1d',
    'max': '6d'
  }
 };


var resulting_object = $.extend(true, {}, base_json_obj, new_json_obj);

结果对象是

{
  'regions': [
    'FL',
    '-Miami',
    'VA',
    '-Richmond'
  ],
  'vehicles': [
    'Hyundai:Sonata',
    'Nissan:Altima'
  ]
  'turnover': {
    'min': '1d',
    'max': '6d'
  },
}

这是预期的输出。请注意,regions包含所有6个值,而vehicles包含所有3个值。

{
  'regions': [
    'NC',
    '-Greensboro',
    'VA',
    '-Richmond',
    'FL',
    '-Miami'
  ],
  'vehicles': [
    'Ford:Escape',
    'Nissan:Altima',
    'Hyundai:Sonata'
  ]
  'turnover': {
    'min': '1d',
    'max': '6d'
  },
}

有没有办法修改对$.extend()的调用或以某种方式使用$.merge()来实现此目的?

2 个答案:

答案 0 :(得分:1)

$.extend(true, ...)会使用valueindex将对象视为对象,因此就像'min'一样,0的键将被替换。

你需要写一些处理这种情况的东西。 $.extend()函数相对复杂,但是一个好的起点:

答案 1 :(得分:0)

您可以使用循环:

var base_json_obj = {
    'regions': [
   'NC',
    '-Greensboro',
    'VA',
    '-Richmond'
  ],
  'vehicles': [
    'Ford:Escape',
    'Nissan:Altima'
  ],
  'turnover': {
    'min': '0d',
    'max': '5d'
  }
 };

 var new_json_obj = {
    'regions': [
    'FL',
    '-Miami'
  ],
  'vehicles': [
    'Hyundai:Sonata'
  ],
  'turnover': {
    'min': '1d',
    'max': '6d'
  }
 };


var resulting_object={};
for (key in base_json_obj) {
    // the values from base and new json objects respectively
    var val1 = base_json_obj[key], val2 = new_json_obj[key];
    resulting_object[key] = Array.isArray(val1)? // if array
    val1.concat(val2): // concatenate them, else (objects)
    Object.assign({}, val1, val2); // assign the second object to the first one
}
console.log(resulting_object);