首先,我认为您使用 $.extend 不正确。您的真实参数应该是进行递归的第一个参数。其次,我认为没有任何方法可以使用 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 作为参数来扩展 & 以包含排除选项数组;但不在这个版本中:)