<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: olHelpers/SortedFeatures.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: olHelpers/SortedFeatures.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>/** * Created by gavorhes on 12/23/2015. */ import provide from '../util/provide'; let nm = provide('olHelpers'); /** * take an array of features and sort by a given property name */ class SortedFeatures { /** * * @param {Array<ol.Feature>} features array of ol features * @param {string} propertyName - the property name to use for lookup */ constructor(features, propertyName) { this.sortedFeatures = features; this.propertyName = propertyName; if (this.sortedFeatures.length > 0) { this._propertyType = typeof this.sortedFeatures[0].getProperties()[this.propertyName]; let _this = this; this.sortedFeatures.sort(function (a, b) { if (_this._propertyType == 'number'){ return (a['getProperties']()[_this.propertyName] - b['getProperties']()[_this.propertyName]); } else if (_this._propertyType == 'string'){ return (a['getProperties']()[_this.propertyName] > b['getProperties']()[_this.propertyName]); } }); } } /** * recursive search to find the value * @param {number|string} propertyValue - the property value to search for * @param {boolean} [exactMatch=false] if only an exact match should be returned * @param {Array} [sortedFeatures=this.sortedFeatures] - the candidate features * @returns {ol.Feature|undefined} the feature matching the lookup */ getFeature(propertyValue, exactMatch, sortedFeatures) { if (typeof sortedFeatures == 'undefined'){ sortedFeatures = this.sortedFeatures; } if (typeof exactMatch !== 'boolean'){ exactMatch = false; } if (sortedFeatures.length == 0){ return undefined; } if (sortedFeatures.length == 1){ if (exactMatch){ if (sortedFeatures[0].getProperties()[this.propertyName] == propertyValue){ return sortedFeatures[0]; } else { return undefined; } } else { return sortedFeatures[0]; } } let lowProp = sortedFeatures[0].getProperties()[this.propertyName]; let highProp = sortedFeatures[sortedFeatures.length - 1].getProperties()[this.propertyName]; if (exactMatch){ if (lowProp == propertyValue){ return sortedFeatures[0]; } else if (propertyValue < lowProp){ return undefined; } else if (highProp == propertyValue){ return sortedFeatures[sortedFeatures.length - 1]; } else if (propertyValue > highProp){ return undefined; } } else { if (propertyValue <= lowProp){ return sortedFeatures[0]; } else if (propertyValue >= highProp){ return sortedFeatures[sortedFeatures.length - 1]; } } let midIndex = Math.floor(sortedFeatures.length / 2); let midFeature = sortedFeatures[midIndex]; let midProperty = midFeature.getProperties()[this.propertyName]; if (midProperty === propertyValue){ return midFeature; } if (propertyValue < midProperty){ return this.getFeature(propertyValue, exactMatch, sortedFeatures.slice(0, midIndex)); } else { return this.getFeature(propertyValue, exactMatch, sortedFeatures.slice(midIndex)); } } } nm.SortedFeatures = SortedFeatures; export default SortedFeatures; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="-_FeatureLayerProperties.html">_FeatureLayerProperties</a></li><li><a href="-_Slider.html">_Slider</a></li><li><a href="CommonSymbol.html">CommonSymbol</a></li><li><a href="DayRange.html">DayRange</a></li><li><a href="ItsLayerCollection.html">ItsLayerCollection</a></li><li><a href="LayerBase.html">LayerBase</a></li><li><a href="LayerBaseVector.html">LayerBaseVector</a></li><li><a href="LayerBaseVectorEsri.html">LayerBaseVectorEsri</a></li><li><a href="LayerBaseVectorGeoJson.html">LayerBaseVectorGeoJson</a></li><li><a href="LayerBaseXyzTile.html">LayerBaseXyzTile</a></li><li><a href="LayerEsriMapServer.html">LayerEsriMapServer</a></li><li><a href="LayerEsriTile.html">LayerEsriTile</a></li><li><a href="LayerGroup.html">LayerGroup</a></li><li><a href="LayerItsInventory.html">LayerItsInventory</a></li><li><a href="LayerLegend.html">LayerLegend</a></li><li><a href="LayerRealEarthTile.html">LayerRealEarthTile</a></li><li><a href="LayerSwipe.html">LayerSwipe</a></li><li><a href="LayerVectorRealEarth.html">LayerVectorRealEarth</a></li><li><a href="MapInteractionBase.html">MapInteractionBase</a></li><li><a href="MapMoveCls.html">MapMoveCls</a></li><li><a href="MapPopupCls.html">MapPopupCls</a></li><li><a href="RealEarthAnimate.html">RealEarthAnimate</a></li><li><a href="RealEarthAnimateTile.html">RealEarthAnimateTile</a></li><li><a href="RealEarthAnimateVector.html">RealEarthAnimateVector</a></li><li><a href="SingleSymbol.html">SingleSymbol</a></li><li><a href="Sliders.html">Sliders</a></li><li><a href="SortedFeatures.html">SortedFeatures</a></li><li><a href="UniqueValueSymbol.html">UniqueValueSymbol</a></li></ul><h3>Global</h3><ul><li><a href="global.html#bundleEs2015Multiple">bundleEs2015Multiple</a></li><li><a href="global.html#dateToYyyyMmDdHh000">dateToYyyyMmDdHh000</a></li><li><a href="global.html#dateToYyyyMmDdHhMmSs">dateToYyyyMmDdHhMmSs</a></li><li><a href="global.html#definedAndNotNull">definedAndNotNull</a></li><li><a href="global.html#defineLegend">defineLegend</a></li><li><a href="global.html#defineStyle">defineStyle</a></li><li><a href="global.html#gulp">gulp</a></li><li><a href="global.html#hexAlphaToRgbOrRgba">hexAlphaToRgbOrRgba</a></li><li><a href="global.html#htmlEscape">htmlEscape</a></li><li><a href="global.html#keyValPairs">keyValPairs</a></li><li><a href="global.html#makeBlueGreenRedGradient">makeBlueGreenRedGradient</a></li><li><a href="global.html#makeBlueGreenRedGradientZScore">makeBlueGreenRedGradientZScore</a></li><li><a href="global.html#makeFeatureServiceLegendAndSymbol">makeFeatureServiceLegendAndSymbol</a></li><li><a href="global.html#makeGuid">makeGuid</a></li><li><a href="global.html#makeMapServiceLegend">makeMapServiceLegend</a></li><li><a href="global.html#mapServiceLegendItem">mapServiceLegendItem</a></li><li><a href="global.html#offsetMinutes">offsetMinutes</a></li><li><a href="global.html#processLessFile">processLessFile</a></li><li><a href="global.html#propertiesZoomStyle">propertiesZoomStyle</a></li><li><a href="global.html#provide">provide</a></li><li><a href="global.html#quickMap">quickMap</a></li><li><a href="global.html#quickMapBase">quickMapBase</a></li><li><a href="global.html#quickMapMulti">quickMapMulti</a></li><li><a href="global.html#resolutionToZoom">resolutionToZoom</a></li><li><a href="global.html#rgb2hex">rgb2hex</a></li><li><a href="global.html#rgbToRgba">rgbToRgba</a></li><li><a href="global.html#triggerCallback">triggerCallback</a></li><li><a href="global.html#undefinedOrNull">undefinedOrNull</a></li><li><a href="global.html#zoomToResolution">zoomToResolution</a></li></ul> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.0</a> on Tue Jun 07 2016 12:31:52 GMT-0500 (Central Daylight Time) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>