@@ -102,7 +102,17 @@ exports.attributes = {
102102 '*value* is expected to be an array with as many items as' ,
103103 'the desired set elements.'
104104 ] . join ( ' ' )
105- }
105+ } ,
106+ preservegaps : {
107+ valType : 'boolean' ,
108+ dflt : false ,
109+ description : [
110+ 'Determines whether or not gaps in data arrays produced by the filter operation' ,
111+ 'are preserved or not.' ,
112+ 'Setting this to *true* might be useful when plotting a line chart' ,
113+ 'with `connectgaps` set to *true*.'
114+ ] . join ( ' ' )
115+ } ,
106116} ;
107117
108118exports . supplyDefaults = function ( transformIn ) {
@@ -115,6 +125,7 @@ exports.supplyDefaults = function(transformIn) {
115125 var enabled = coerce ( 'enabled' ) ;
116126
117127 if ( enabled ) {
128+ coerce ( 'preservegaps' ) ;
118129 coerce ( 'operation' ) ;
119130 coerce ( 'value' ) ;
120131 coerce ( 'target' ) ;
@@ -150,36 +161,47 @@ exports.calcTransform = function(gd, trace, opts) {
150161 var d2cTarget = ( target === 'x' || target === 'y' || target === 'z' ) ?
151162 target : filterArray ;
152163
153- var dataToCoord = getDataToCoordFunc ( gd , trace , d2cTarget ) ,
154- filterFunc = getFilterFunc ( opts , dataToCoord , targetCalendar ) ,
155- arrayAttrs = PlotSchema . findArrayAttributes ( trace ) ,
156- originalArrays = { } ;
157-
158- // copy all original array attribute values,
159- // and clear arrays in trace
160- for ( var k = 0 ; k < arrayAttrs . length ; k ++ ) {
161- var attr = arrayAttrs [ k ] ,
162- np = Lib . nestedProperty ( trace , attr ) ;
164+ var dataToCoord = getDataToCoordFunc ( gd , trace , d2cTarget ) ;
165+ var filterFunc = getFilterFunc ( opts , dataToCoord , targetCalendar ) ;
166+ var arrayAttrs = PlotSchema . findArrayAttributes ( trace ) ;
167+ var originalArrays = { } ;
163168
164- originalArrays [ attr ] = Lib . extendDeep ( [ ] , np . get ( ) ) ;
165- np . set ( [ ] ) ;
169+ function forAllAttrs ( fn , index ) {
170+ for ( var j = 0 ; j < arrayAttrs . length ; j ++ ) {
171+ var np = Lib . nestedProperty ( trace , arrayAttrs [ j ] ) ;
172+ fn ( np , index ) ;
173+ }
166174 }
167175
168- function fill ( attr , i ) {
169- var oldArr = originalArrays [ attr ] ,
170- newArr = Lib . nestedProperty ( trace , attr ) . get ( ) ;
171-
172- newArr . push ( oldArr [ i ] ) ;
176+ var initFn ;
177+ var fillFn ;
178+ if ( opts . preservegaps ) {
179+ initFn = function ( np ) {
180+ originalArrays [ np . astr ] = Lib . extendDeep ( [ ] , np . get ( ) ) ;
181+ np . set ( new Array ( len ) ) ;
182+ } ;
183+ fillFn = function ( np , index ) {
184+ var val = originalArrays [ np . astr ] [ index ] ;
185+ np . get ( ) [ index ] = val ;
186+ } ;
187+ } else {
188+ initFn = function ( np ) {
189+ originalArrays [ np . astr ] = Lib . extendDeep ( [ ] , np . get ( ) ) ;
190+ np . set ( [ ] ) ;
191+ } ;
192+ fillFn = function ( np , index ) {
193+ var val = originalArrays [ np . astr ] [ index ] ;
194+ np . get ( ) . push ( val ) ;
195+ } ;
173196 }
174197
175- for ( var i = 0 ; i < len ; i ++ ) {
176- var v = filterArray [ i ] ;
198+ // copy all original array attribute values, and clear arrays in trace
199+ forAllAttrs ( initFn ) ;
177200
178- if ( ! filterFunc ( v ) ) continue ;
179-
180- for ( var j = 0 ; j < arrayAttrs . length ; j ++ ) {
181- fill ( arrayAttrs [ j ] , i ) ;
182- }
201+ // loop through filter array, fill trace arrays if passed
202+ for ( var i = 0 ; i < len ; i ++ ) {
203+ var passed = filterFunc ( filterArray [ i ] ) ;
204+ if ( passed ) forAllAttrs ( fillFn , i ) ;
183205 }
184206} ;
185207
0 commit comments