$ .extend,排除了一些JSON对象

时间:2013-06-17 10:07:12

标签: javascript jquery extend

请参阅以下代码。

var series=$.extend({},true,options,this.model.series);

这会将选项中的所有JSON对象合并到this.model.series。我想从使用this.model.series

的合并选项中排除单个JSON对象
options:{style:{},points:[{},{}], marker:{},...} 

我想将选项中的所有json对象合并或复制到this.model.series except points

因为10,000个点需要很长时间才能将所有json对象与this.model.series合并,这会降低性能。

如何通过有效使用$ .extend来提高性能(可能是点合并需要花费太多时间)。我该怎么办呢?

谢谢,

希瓦

1 个答案:

答案 0 :(得分:2)

首先,我认为你错误地使用$ .extend。您的true参数应该是进行递归的第一个参数。其次,我认为没有任何方法可以使用jQuery.extend()进行扩展排除。试试这个:

var series = {};
$.each(options,function(key,value){
  if( key != 'points' )
    series[key] = value;
});
$.extend(true,series,this.model.series);

这是懒惰的方式。这样你就可以检查其他键(不只是'点')。如果这还不够快,那么你应该在该函数中创建递归并手动扩展对象,而不必在之后使用jQuery扩展。

或者,在扩展后重新包括新点:

var points = options.points;
options.points = null;
series = $.extend(true,options,this.model.series);
series.points = points;

在对保存点进行评论后进行修改:

var tempOptions = options, tempSeries = this.model.series;
tempOptions.points = null;
tempSeries.points = null;
var series = $.extend(true,tempOptions,tempSeries);
series.points = options.points; // Use this one OR
series.points = this.model.series.points; // Use this one, depending on what you need

进一步努力:

var series = {}, tempSeries = {};
$.each(options,function(key,value){
  if( key != 'points' )
    series[key] = value;
});
$.each(this.model.series,function(key,value){
  if( key != 'points' )
    tempSeries[key] = value;
});
$.extend(true,series,tempSeries);
series.points = this.model.series.points;

自定义实施:

function extendExclude( exclude, obj1, obj2 ) {
    for( i in obj2 ) {
        if( ( typeof obj1[i] !== 'object' ) || ( typeof obj2[i] !== 'object' ) ) {
            obj1[i] = obj2[i];
        } else if( i != exclude ) {
            extendExclude( null, obj1[i], obj2[i] )
        }
    }
    return obj1;
}

var series = extendExclude( 'points', options, this.model.series );

这可以扩展到包括无限objs作为参数来扩展&包括一系列排除选项;但不是在这个版本中:))