goodies
Version:
Native object extension goodies.
80 lines (72 loc) • 1.84 kB
JavaScript
var extend = function(object, methodName, method) {
if (!object.prototype[methodName]) {
Object.defineProperty(object.prototype, methodName, {
enumerable: false,
value: method
});
}
};
extend(Array, "bsearch", function(value, compare) {
var arr = this
, hi = arr.length - 1
, lo = 0
, pos
, dir
, compare;
compare = compare || function(a, b) { return a - b };
while (lo <= hi) {
pos = (hi - lo)/2 + lo;
pos = Math.floor(pos);
dir = compare(arr[pos], value);
if (dir > 0) {
hi = pos - 1;
} else if (dir < 0) {
lo = pos + 1;
} else {
return pos;
}
}
return -1;
});
extend(Array, "unique", function() {
for (var i = 1; i < this.length; ++i) {
if (this[i] == this[i - 1]) {
this.splice(i, 1);
--i;
}
}
return this;
});
extend(Array, "last", function() {
return this[this.length - 1];
});
extend(Object, "join", function(object) {
var objectA = object
, objectB = this
, merged = {}
, keysA = Object.keys(objectA)
, keysB = Object.keys(objectB)
, keys = keysA.concat(keysB).sort().unique()
, key;
for (var i = 0, l = keys.length; i < l; ++i) {
key = keys[i];
if (objectA.hasOwnProperty(key) && objectB.hasOwnProperty(key)) {
if (typeof objectA[key] === "object" && typeof objectB[key] === "object") {
merged[key] = objectB[key].merge(objectA[key]);
} else {
merged[key] = objectA[key];
}
} else if (objectA.hasOwnProperty(key)) {
merged[key] = objectA[key];
} else if (objectB.hasOwnProperty(key)) {
merged[key] = objectB[key];
}
}
return merged;
});
extend(Date, "unixTime", function() {
return Math.floor(this.getTime()/1000);
});
extend(Date, "fromUnixTime", function(time) {
this.setTime(time*1000);
});