Skip to content

Instantly share code, notes, and snippets.

@dribnet
Last active December 9, 2015 20:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dribnet/4326899 to your computer and use it in GitHub Desktop.
Save dribnet/4326899 to your computer and use it in GitHub Desktop.
MatthewMueller's array working with leaflet.js
;(function(){
/**
* hasOwnProperty.
*/
var has = Object.prototype.hasOwnProperty;
/**
* Require the given path.
*
* @param {String} path
* @return {Object} exports
* @api public
*/
function require(path, parent, orig) {
var resolved = require.resolve(path);
// lookup failed
if (null == resolved) {
orig = orig || path;
parent = parent || 'root';
var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
err.path = orig;
err.parent = parent;
err.require = true;
throw err;
}
var module = require.modules[resolved];
// perform real require()
// by invoking the module's
// registered function
if (!module.exports) {
module.exports = {};
module.client = module.component = true;
module.call(this, module.exports, require.relative(resolved), module);
}
return module.exports;
}
/**
* Registered modules.
*/
require.modules = {};
/**
* Registered aliases.
*/
require.aliases = {};
/**
* Resolve `path`.
*
* Lookup:
*
* - PATH/index.js
* - PATH.js
* - PATH
*
* @param {String} path
* @return {String} path or null
* @api private
*/
require.resolve = function(path) {
if (path.charAt(0) === '/') path = path.slice(1);
var index = path + '/index.js';
var paths = [
path,
path + '.js',
path + '.json',
path + '/index.js',
path + '/index.json'
];
for (var i = 0; i < paths.length; i++) {
var path = paths[i];
if (has.call(require.modules, path)) return path;
}
if (has.call(require.aliases, index)) {
return require.aliases[index];
}
};
/**
* Normalize `path` relative to the current path.
*
* @param {String} curr
* @param {String} path
* @return {String}
* @api private
*/
require.normalize = function(curr, path) {
var segs = [];
if ('.' != path.charAt(0)) return path;
curr = curr.split('/');
path = path.split('/');
for (var i = 0; i < path.length; ++i) {
if ('..' == path[i]) {
curr.pop();
} else if ('.' != path[i] && '' != path[i]) {
segs.push(path[i]);
}
}
return curr.concat(segs).join('/');
};
/**
* Register module at `path` with callback `definition`.
*
* @param {String} path
* @param {Function} definition
* @api private
*/
require.register = function(path, definition) {
require.modules[path] = definition;
};
/**
* Alias a module definition.
*
* @param {String} from
* @param {String} to
* @api private
*/
require.alias = function(from, to) {
if (!has.call(require.modules, from)) {
throw new Error('Failed to alias "' + from + '", it does not exist');
}
require.aliases[to] = from;
};
/**
* Return a require function relative to the `parent` path.
*
* @param {String} parent
* @return {Function}
* @api private
*/
require.relative = function(parent) {
var p = require.normalize(parent, '..');
/**
* lastIndexOf helper.
*/
function lastIndexOf(arr, obj) {
var i = arr.length;
while (i--) {
if (arr[i] === obj) return i;
}
return -1;
}
/**
* The relative require() itself.
*/
function localRequire(path) {
var resolved = localRequire.resolve(path);
return require(resolved, parent, path);
}
/**
* Resolve relative to the parent.
*/
localRequire.resolve = function(path) {
var c = path.charAt(0);
if ('/' == c) return path.slice(1);
if ('.' == c) return require.normalize(p, path);
// resolve deps by returning
// the dep in the nearest "deps"
// directory
var segs = parent.split('/');
var i = lastIndexOf(segs, 'deps') + 1;
if (!i) i = 0;
path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
return path;
};
/**
* Check if module is defined at `path`.
*/
localRequire.exists = function(path) {
return has.call(require.modules, localRequire.resolve(path));
};
return localRequire;
};
require.register("component-emitter/index.js", function(exports, require, module){
/**
* Expose `Emitter`.
*/
module.exports = Emitter;
/**
* Initialize a new `Emitter`.
*
* @api public
*/
function Emitter(obj) {
if (obj) return mixin(obj);
};
/**
* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in Emitter.prototype) {
obj[key] = Emitter.prototype[key];
}
return obj;
}
/**
* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.on = function(event, fn){
this._callbacks = this._callbacks || {};
(this._callbacks[event] = this._callbacks[event] || [])
.push(fn);
return this;
};
/**
* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.once = function(event, fn){
var self = this;
this._callbacks = this._callbacks || {};
function on() {
self.off(event, on);
fn.apply(this, arguments);
}
fn._off = on;
this.on(event, on);
return this;
};
/**
* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners = function(event, fn){
this._callbacks = this._callbacks || {};
var callbacks = this._callbacks[event];
if (!callbacks) return this;
// remove all handlers
if (1 == arguments.length) {
delete this._callbacks[event];
return this;
}
// remove specific handler
var i = callbacks.indexOf(fn._off || fn);
if (~i) callbacks.splice(i, 1);
return this;
};
/**
* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/
Emitter.prototype.emit = function(event){
this._callbacks = this._callbacks || {};
var args = [].slice.call(arguments, 1)
, callbacks = this._callbacks[event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this, args);
}
}
return this;
};
/**
* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/
Emitter.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks[event] || [];
};
/**
* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/
Emitter.prototype.hasListeners = function(event){
return !! this.listeners(event).length;
};
});
require.register("component-to-function/index.js", function(exports, require, module){
/**
* Expose `toFunction()`.
*/
module.exports = toFunction;
/**
* Convert `obj` to a `Function`.
*
* @param {Mixed} obj
* @return {Function}
* @api private
*/
function toFunction(obj) {
switch ({}.toString.call(obj)) {
case '[object Object]':
return objectToFunction(obj);
case '[object Function]':
return obj;
case '[object String]':
return stringToFunction(obj);
case '[object RegExp]':
return regexpToFunction(obj);
default:
return defaultToFunction(obj);
}
}
/**
* Default to strict equality.
*
* @param {Mixed} val
* @return {Function}
* @api private
*/
function defaultToFunction(val) {
return function(obj){
return val === obj;
}
}
/**
* Convert `re` to a function.
*
* @param {RegExp} re
* @return {Function}
* @api private
*/
function regexpToFunction(re) {
return function(obj){
return re.test(obj);
}
}
/**
* Convert property `str` to a function.
*
* @param {String} str
* @return {Function}
* @api private
*/
function stringToFunction(str) {
// immediate such as "> 20"
if (/^ *\W+/.test(str)) return new Function('_', 'return _ ' + str);
// properties such as "name.first" or "age > 18"
return new Function('_', 'return _.' + str);
}
/**
* Convert `object` to a function.
*
* @param {Object} object
* @return {Function}
* @api private
*/
function objectToFunction(obj) {
var match = {}
for (var key in obj) {
match[key] = typeof obj[key] === 'string'
? defaultToFunction(obj[key])
: toFunction(obj[key])
}
return function(val){
if (typeof val !== 'object') return false;
for (var key in match) {
if (!(key in val)) return false;
if (!match[key](val[key])) return false;
}
return true;
}
}
});
require.register("array/index.js", function(exports, require, module){
module.exports = require('./lib/array');
});
require.register("array/lib/array.js", function(exports, require, module){
/**
* Module dependencies
*/
var Emitter = require('emitter'),
Enumerable = require('./enumerable'),
proto = Array.prototype;
/*
* Expose `array`
*/
module.exports = array;
// used to check argument to constructor, etc.
function isArray(obj) {
return ((obj && obj.isArray === '[object Array]') ||
(Object.prototype.toString.call(obj) === '[object Array]'));
}
/**
* Initialize `array`
*/
function array() {
var arr = null;
if (arguments.length == 1 && isArray(arguments[0])) {
arr = arguments[0];
}
else {
arr = Array.prototype.slice.call(arguments);
}
if(!(this instanceof array)) return new array(arr);
// array-like
var len = this.length = arr.length;
for(var i = 0; i < len; i++) {
this[i] = arr[i];
}
}
/**
* Mixin `Emitter`
*/
Emitter(array.prototype);
/**
* Mixin `Enumerable`
*/
Enumerable(array.prototype);
/**
* add a marker that this object wants to be treated as an array by other libraries
* (see https://github.com/dribnet/isArray.js)
*/
array.prototype.isArray = '[object Array]';
/**
* Removes the last element from an array and returns that element
*
* @return {Mixed} removed element
*/
array.prototype.pop = function() {
var ret = proto.pop.apply(this, arguments);
this.emit('remove', ret);
return ret;
};
/**
* Push a value onto the end of the array,
* returning the length of the array
*
* @param {Mixed, ...} elements
* @return {Number}
*/
array.prototype.push = function() {
var ret = proto.push.apply(this, arguments),
args = [].slice.call(arguments);
for(var i = 0, len = args.length; i < len; i++) this.emit('add', args[i]);
return ret;
};
/**
* Removes the first element from an array and returns that element.
*
* @return {Mixed}
*/
array.prototype.shift = function() {
var ret = proto.shift.apply(this, arguments);
this.emit('remove', ret);
return ret;
};
/**
* Adds and/or removes elements from an array.
*
* @param {Number} index
* @param {Number} howMany
* @param {Mixed, ...} elements
* @return {Array} removed elements
*/
array.prototype.splice = function() {
var ret = proto.splice.apply(this, arguments),
added = [].slice.call(arguments, 2);
for(var i = 0, len = ret.length; i < len; i++) this.emit('remove', ret[i]);
for( i = 0, len = added.length; i < len; i++) this.emit('add', added[i]);
return ret;
};
/**
* Adds one or more elements to the front of an array
* and returns the new length of the array.
*
* @param {Mixed, ...} elements
* @return {Number} length
*/
array.prototype.unshift = function() {
var ret = proto.unshift.apply(this, arguments),
args = [].slice.call(arguments);
for(var i = 0, len = args.length; i < len; i++) this.emit('add', args[i]);
return ret;
};
/**
* toString
*/
array.prototype.toString =
array.prototype.toJSON = function() {
return proto.slice.call(this);
};
/**
* Attach the rest of the array methods
*
* TODO: implement lastIndexOf in ./lib/enumerable so it works in IE
*/
var methods = ['sort', 'reverse', 'concat', 'join', 'slice', 'lastIndexOf'];
methods.forEach(function(method) {
array.prototype[method] = function() {
return proto[method].apply(this, arguments);
};
});
});
require.register("array/lib/enumerable.js", function(exports, require, module){
/**
* Module Dependencies
*/
var toFunction = require('to-function'),
proto = {};
/**
* Mixin to `obj`.
*
* var Enumerable = require('enumerable');
* Enumerable(Something.prototype);
*
* @param {Object} obj
* @return {Object} obj
*/
module.exports = function(obj) {
for(var key in proto) obj[key] = proto[key];
return obj;
};
/**
* Iterate each value and invoke `fn(val, i)`.
*
* users.each(function(val, i){
*
* })
*
* @param {Function} fn
* @return {Object} self
* @api public
*/
proto.forEach =
proto.each = function(fn){
var arr = this,
len = arr.length;
for (var i = 0; i < len; i++) {
fn(arr[i], i);
}
return this;
};
/**
* Map each return value from `fn(val, i)`.
*
* Passing a callback function:
*
* users.map(function(user){
* return user.name.first
* })
*
* Passing a property string:
*
* users.map('name.first')
*
* @param {Function} fn
* @return {Enumerable}
* @api public
*/
proto.map = function(fn){
fn = toFunction(fn);
var arr = this,
len = arr.length;
for (var i = 0; i < len; ++i) {
arr[i] = fn(arr[i], i);
}
return this;
};
/**
* Select all values that return a truthy value of `fn(val, i)`.
*
* users.select(function(user){
* return user.age > 20
* })
*
* With a property:
*
* items.select('complete')
*
* @param {Function|String} fn
* @return {Enumerable}
* @api public
*/
proto.filter =
proto.select = function(fn){
fn = toFunction(fn);
var out = [],
arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (fn(val, i)) out.push(val);
}
return new arr.constructor(out);
};
/**
* Select all unique values.
*
* nums.unique()
*
* @return {Enumerable}
* @api public
*/
proto.unique = function(){
var out = [],
arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (~arr.indexOf(val)) continue;
out.push(val);
}
return new arr.constructor(out);
};
/**
* Reject all values that return a truthy value of `fn(val, i)`.
*
* Rejecting using a callback:
*
* users.reject(function(user){
* return user.age < 20
* })
*
* Rejecting with a property:
*
* items.reject('complete')
*
* Rejecting values via `==`:
*
* data.reject(null)
* users.reject(tobi)
*
* @param {Function|String|Mixed} fn
* @return {Enumerable}
* @api public
*/
proto.reject = function(fn){
var out = [],
arr = this,
len = arr.length,
val, i;
if ('string' == typeof fn) fn = toFunction(fn);
if (fn) {
for (i = 0; i < len; ++i) {
val = arr[i];
if (!fn(arr[i], i)) out.push(val);
}
} else {
for (i = 0; i < len; ++i) {
val = arr[i];
if (val != fn) out.push(val);
}
}
return new arr.constructor(out);
};
/**
* Reject `null` and `undefined`.
*
* [1, null, 5, undefined].compact()
* // => [1,5]
*
* @return {Enumerable}
* @api public
*/
proto.compact = function(){
return this.reject(null);
};
/**
* Return the first value when `fn(val, i)` is truthy,
* otherwise return `undefined`.
*
* users.find(function(user){
* return user.role == 'admin'
* })
*
* With a property string:
*
* users.find('age > 20')
*
* @param {Function|String} fn
* @return {Mixed}
* @api public
*/
proto.find = function(fn){
fn = toFunction(fn);
var arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (fn(val, i)) return val;
}
};
/**
* Return the last value when `fn(val, i)` is truthy,
* otherwise return `undefined`.
*
* users.findLast(function(user){
* return user.role == 'admin'
* })
*
* @param {Function} fn
* @return {Mixed}
* @api public
*/
proto.findLast = function (fn) {
fn = toFunction(fn);
var arr = this,
i = arr.length;
while(i--) if (fn(arr[i], i)) return arr[i];
};
/**
* Assert that all invocations of `fn(val, i)` are truthy.
*
* For example ensuring that all pets are ferrets:
*
* pets.all(function(pet){
* return pet.species == 'ferret'
* })
*
* users.all('admin')
*
* @param {Function|String} fn
* @return {Boolean}
* @api public
*/
proto.every = function(fn){
fn = toFunction(fn);
var arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (!fn(val, i)) return false;
}
return true;
};
/**
* Assert that none of the invocations of `fn(val, i)` are truthy.
*
* For example ensuring that no pets are admins:
*
* pets.none(function(p){ return p.admin })
* pets.none('admin')
*
* @param {Function|String} fn
* @return {Boolean}
* @api public
*/
proto.none = function(fn){
fn = toFunction(fn);
var arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (fn(val, i)) return false;
}
return true;
};
/**
* Assert that at least one invocation of `fn(val, i)` is truthy.
*
* For example checking to see if any pets are ferrets:
*
* pets.any(function(pet){
* return pet.species == 'ferret'
* })
*
* @param {Function} fn
* @return {Boolean}
* @api public
*/
proto.any = function(fn){
fn = toFunction(fn);
var arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (fn(val, i)) return true;
}
return false;
};
/**
* Count the number of times `fn(val, i)` returns true.
*
* var n = pets.count(function(pet){
* return pet.species == 'ferret'
* })
*
* @param {Function} fn
* @return {Number}
* @api public
*/
proto.count = function(fn){
fn = toFunction(fn);
var n = 0,
arr = this,
len = arr.length,
val;
if(!fn) return len;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (fn(val, i)) ++n;
}
return n;
};
/**
* Determine the indexof `obj` or return `-1`.
*
* @param {Mixed} obj
* @return {Number}
* @api public
*/
proto.indexOf = function(obj) {
var arr = this,
len = arr.length,
val;
for (var i = 0; i < len; ++i) {
val = arr[i];
if (val === obj) return i;
}
return -1;
};
/**
* Check if `obj` is present in this enumerable.
*
* @param {Mixed} obj
* @return {Boolean}
* @api public
*/
proto.has = function(obj) {
return !! ~this.indexOf(obj);
};
/**
* Reduce with `fn(accumulator, val, i)` using
* optional `init` value defaulting to the first
* enumerable value.
*
* @param {Function} fn
* @param {Mixed} [val]
* @return {Mixed}
* @api public
*/
proto.reduce = function(fn, init){
var arr = this,
len = arr.length,
i = 0,
val;
val = null == init
? arr.get(i++)
: init;
for (; i < len; ++i) {
val = fn(val, arr[i], i);
}
return val;
};
/**
* Determine the max value.
*
* With a callback function:
*
* pets.max(function(pet){
* return pet.age
* })
*
* With property strings:
*
* pets.max('age')
*
* With immediate values:
*
* nums.max()
*
* @param {Function|String} fn
* @return {Number}
* @api public
*/
proto.max = function(fn){
var arr = this,
len = arr.length,
max = -Infinity,
n = 0,
val, i;
if (fn) {
fn = toFunction(fn);
for (i = 0; i < len; ++i) {
n = fn(arr[i], i);
max = n > max ? n : max;
}
} else {
for (i = 0; i < len; ++i) {
n = arr[i];
max = n > max ? n : max;
}
}
return max;
};
/**
* Determine the min value.
*
* With a callback function:
*
* pets.min(function(pet){
* return pet.age
* })
*
* With property strings:
*
* pets.min('age')
*
* With immediate values:
*
* nums.min()
*
* @param {Function|String} fn
* @return {Number}
* @api public
*/
proto.min = function(fn){
var arr = this,
len = arr.length,
min = Infinity,
n = 0,
val, i;
if (fn) {
fn = toFunction(fn);
for (i = 0; i < len; ++i) {
n = fn(arr[i], i);
min = n < min ? n : min;
}
} else {
for (i = 0; i < len; ++i) {
n = arr[i];
min = n < min ? n : min;
}
}
return min;
};
/**
* Determine the sum.
*
* With a callback function:
*
* pets.sum(function(pet){
* return pet.age
* })
*
* With property strings:
*
* pets.sum('age')
*
* With immediate values:
*
* nums.sum()
*
* @param {Function|String} fn
* @return {Number}
* @api public
*/
proto.sum = function(fn){
var arr = this,
len = arr.length,
n = 0,
val, i;
if (fn) {
fn = toFunction(fn);
for (i = 0; i < len; ++i) {
n += fn(arr[i], i);
}
} else {
for (i = 0; i < len; ++i) {
n += arr[i];
}
}
return n;
};
/**
* Determine the average value.
*
* With a callback function:
*
* pets.avg(function(pet){
* return pet.age
* })
*
* With property strings:
*
* pets.avg('age')
*
* With immediate values:
*
* nums.avg()
*
* @param {Function|String} fn
* @return {Number}
* @api public
*/
proto.avg =
proto.mean = function(fn){
var arr = this,
len = arr.length,
n = 0,
val, i;
if (fn) {
fn = toFunction(fn);
for (i = 0; i < len; ++i) {
n += fn(arr[i], i);
}
} else {
for (i = 0; i < len; ++i) {
n += arr[i];
}
}
return n / len;
};
/**
* Return the first value, or first `n` values.
*
* @param {Number|Function} [n]
* @return {Array|Mixed}
* @api public
*/
proto.first = function(n) {
var arr = this;
if(!n) return arr[0];
else if ('number' !== typeof n) return this.find(n);
var len = Math.min(n, arr.length),
out = new Array(len);
for (var i = 0; i < len; ++i) {
out[i] = arr[i];
}
return out;
};
/**
* Return the last value, or last `n` values.
*
* @param {Number|Function} [n]
* @return {Array|Mixed}
* @api public
*/
proto.last = function(n){
var arr = this,
len = arr.length;
if(!n) return arr[len - 1];
else if ('number' !== typeof n) return this.findLast(n);
var i = Math.max(0, len - n),
out = [];
for (; i < len; ++i) {
out.push(arr[i]);
}
return out;
};
});
require.alias("component-emitter/index.js", "array/deps/emitter/index.js");
require.alias("component-to-function/index.js", "array/deps/to-function/index.js");
if (typeof exports == "object") {
module.exports = require("array");
} else if (typeof define == "function" && define.amd) {
define(function(){ return require("array"); });
} else {
window["array"] = require("array");
}})();
<!DOCTYPE html>
<html>
<head>
<title>Leaflet Quick Start Guide Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.css" />
<!--[if lte IE 8]><link rel="stylesheet" href="../dist/leaflet.ie.css" /><![endif]-->
</head>
<body>
<div id="map" style="width: 960px; height: 500px"></div>
<script src="isArray-polyfill.js"></script>
<script src="array.js"></script>
<script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script>
<script>
var centerPoint = array(51.505, -0.09);
var circleCenter = array(51.508, -0.11);
var polygonPoints = array(
array(51.509, -0.08),
array(51.503, -0.06),
array(51.51, -0.047)
);
var map = L.map('map').setView(centerPoint, 13);
L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
}).addTo(map);
L.marker(centerPoint).addTo(map)
.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
L.circle(circleCenter, 500, {
color: 'red',
fillColor: '#f03',
fillOpacity: 0.5
}).addTo(map).bindPopup("I am a circle.");
L.polygon(polygonPoints).addTo(map).bindPopup("I am a polygon.");
var popup = L.popup();
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent("You clicked the map at " + e.latlng.toString())
.openOn(map);
}
map.on('click', onMapClick);
</script>
</body>
</html>
/**
* Provides isArray.js support for for libraries that verify an object
* is an array via either Object.prototype.toString or Array.isArray.
*
* For more information: https://github.com/dribnet/isArray.js
*/
// this method patches (or implements) Array.isArray
// and stores the original function so it can be restored
(function(ar) {
var isArray = ar.isArray;
// toString is only used if Array.isArray does not exist
var toString = Object.prototype.toString;
ar["$originalToString"] = isArray;
ar.isArray = function(obj) {
var that = this;
if(obj && obj.isArray === '[object Array]') {
return true;
}
else if (isArray) {
return isArray.call(that, obj);
}
else {
// fallback - polyfill the Array.isArray method
return toString.call(obj) === "[object Array]";
}
}
})(Array);
// this method patches Object.prototype.toString
// and stores the original function so it can be restored
(function(op) {
var toString = op.toString;
op["$originalToString"] = toString;
op.toString = function(args) {
var that = this;
if(that && that.isArray === '[object Array]') {
return '[object Array]';
}
else {
return toString.call(that);
}
}
})(Object.prototype);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment