Mediamonkey
%Europe/Berlin %952 %2006, 23:51
Ha mensen, tijd niets gepost!
Ik was 't beu om elke keer een methode te schrijven die een array doorloopt, op zoek naar een al dan niet bestaand item. 't Leek me erg handig om een Decorator class (= Design Pattern) te schrijven die een aantal bruikbare methodes in een array knalt wanneer ik daar behoefte aan heb.
Nu zijn er natuurlijk tig ouwe AS1 prototypes die een Array uitbreiden met leuke functionaliteiten, dus die kun je in deze class inbouwen. Dan hoef je daar nooit weer naar te kijken.
Ik bedenk me ineens dat 't wel leuk zou zijn om met een argument het aantal, of een paar specifieke methodes te kunnen toekennen aan een array ipv alles in eens. Daar ga ik nog even mee spelen. :)
* edit - zo, dat ging makkelijker dan ik dacht. De code is aangepast om nu met initialize een subset van methodes mee te geven die je graag wil toevoegen aan de array ipv de complete zooi.
Zoals altijd, heb je opmerkingen of verbeteringen.. laat maar horen!
- Mediamonkey -
/**
* ArrayDecorator class
*
* Description:
* This class "decorates" an array with nifty extra's. Methods such as contains(), a must have, really!
* Feel free to add more functionalities in this class, and send me a copy ;)
*
* Author: Bart Wttewaall, Mediamonkey
* Date: 26 september 2006
*
* Usage:
* var arr:Array = new Array("one", "two", "three");
* ArrayDecorator.initialize(arr);
* arr.addItemAt(1, "one and a half");
* trace(arr.contains("three"));
* trace(arr);
*
*/
class nl.mediamonkey.array.ArrayDecorator {
// save an instance of itself (Singleton)
private static var decorator:ArrayDecorator = undefined;
private static var mixinProps:Array = ["addItem", "addItemAt", "addItemsAt", "getItemAt",
"removeItemAt", "removeItemsAt", "removeAll", "replaceItemAt", "contains", "getIndicesOnItems",
"findItem", "findItemsFromArray", "sortItems", "sortItemsBy"];
// inherent properties of array
public var length:Number;
public var splice:Function;
public var slice:Function;
public var sortOn:Function;
public var reverse:Function;
public var sort:Function;
public static function initialize(obj:Object, subset:Array):Boolean {
if (decorator == undefined) decorator = new ArrayDecorator();
//obj = obj.prototype; // We don't want to decorate an entire class, just one instance
var mixin:Array = (subset != undefined) ? subset : mixinProps;
for (var i=0; i<mixin.length; i++) {
var prop:String = mixin[i];
obj[prop] = decorator[prop];
}
// now hide all these new methods from a trace()
//_global.ASSetPropFlags(obj, mixinProps, 1);
return true;
}
function addItem(value):Void {
addItemAt(length, value);
}
function addItemAt(index:Number, value):Void {
if (index<length) {
splice(index, 0, value);
} else if (index>length) {
return;
}
this[index] = value;
}
function addItemsAt(index:Number, newItems:Array):Void {
index = Math.min(length, index);
newItems.unshift(index, 0);
splice.apply(this, newItems);
newItems.splice(0, 2);
}
function getItemAt(index:Number) {
return this[index];
}
function removeItemAt(index:Number) {
var ret = this[index];
removeItemsAt(index, 1);
return ret;
}
function removeItemsAt(index:Number, len:Number):Void {
splice(index, len);
}
function removeAll(Void):Void {
splice(0);
}
function replaceItemAt(index:Number, itemObj):Void {
if (index<0 || index>=length) return;
this[index] = itemObj;
}
public function contains(item):Boolean {
var result:Boolean;
if (item instanceof(Array)) result = (findItemsFromArray(item).length > 0);
else result = (findItem(item) > -1);
return result;
}
public function getIndicesOnItems():Array {
var arr:Array;
if (arguments.length > 1) {
arr = arguments;
} else if (arguments.length == 1) {
var obj = arguments[0];
arr = (obj instanceof(Array)) ? obj : [obj];
} else return;
return findItemsFromArray(arr);
}
public function findItem(item):Number {
var i = length;
while (i--) if (this[i] === item) return i;
return -1;
}
public function findItemsFromArray(arr:Array):Array {
var result:Array = new Array(arr.length);
var iLength:Number = length;
var jLength:Number = arr.length;
var found:Number = 0;
for (var i=0; i<iLength; i++) {
for (var j=0; (j < jLength) && (found < arr.length); j++) {
if (this[i] == arr[j]) {
result[j] = i;
found++;
break;
}
}
}
return (result.length > 0) ? result : null;
}
function sortItems(compareFunc, optionFlags):Void {
sort(compareFunc, optionFlags);
}
function sortItemsBy(fieldName, order):Void {
// old "asc" or "desc"
if (typeof(order)=="string") {
sortOn(fieldName);
if (order.toUpperCase()=="DESC") {
reverse();
}
} else {
sortOn(fieldName, order);
}
}
}
Ik was 't beu om elke keer een methode te schrijven die een array doorloopt, op zoek naar een al dan niet bestaand item. 't Leek me erg handig om een Decorator class (= Design Pattern) te schrijven die een aantal bruikbare methodes in een array knalt wanneer ik daar behoefte aan heb.
Nu zijn er natuurlijk tig ouwe AS1 prototypes die een Array uitbreiden met leuke functionaliteiten, dus die kun je in deze class inbouwen. Dan hoef je daar nooit weer naar te kijken.
Ik bedenk me ineens dat 't wel leuk zou zijn om met een argument het aantal, of een paar specifieke methodes te kunnen toekennen aan een array ipv alles in eens. Daar ga ik nog even mee spelen. :)
* edit - zo, dat ging makkelijker dan ik dacht. De code is aangepast om nu met initialize een subset van methodes mee te geven die je graag wil toevoegen aan de array ipv de complete zooi.
Zoals altijd, heb je opmerkingen of verbeteringen.. laat maar horen!
- Mediamonkey -
/**
* ArrayDecorator class
*
* Description:
* This class "decorates" an array with nifty extra's. Methods such as contains(), a must have, really!
* Feel free to add more functionalities in this class, and send me a copy ;)
*
* Author: Bart Wttewaall, Mediamonkey
* Date: 26 september 2006
*
* Usage:
* var arr:Array = new Array("one", "two", "three");
* ArrayDecorator.initialize(arr);
* arr.addItemAt(1, "one and a half");
* trace(arr.contains("three"));
* trace(arr);
*
*/
class nl.mediamonkey.array.ArrayDecorator {
// save an instance of itself (Singleton)
private static var decorator:ArrayDecorator = undefined;
private static var mixinProps:Array = ["addItem", "addItemAt", "addItemsAt", "getItemAt",
"removeItemAt", "removeItemsAt", "removeAll", "replaceItemAt", "contains", "getIndicesOnItems",
"findItem", "findItemsFromArray", "sortItems", "sortItemsBy"];
// inherent properties of array
public var length:Number;
public var splice:Function;
public var slice:Function;
public var sortOn:Function;
public var reverse:Function;
public var sort:Function;
public static function initialize(obj:Object, subset:Array):Boolean {
if (decorator == undefined) decorator = new ArrayDecorator();
//obj = obj.prototype; // We don't want to decorate an entire class, just one instance
var mixin:Array = (subset != undefined) ? subset : mixinProps;
for (var i=0; i<mixin.length; i++) {
var prop:String = mixin[i];
obj[prop] = decorator[prop];
}
// now hide all these new methods from a trace()
//_global.ASSetPropFlags(obj, mixinProps, 1);
return true;
}
function addItem(value):Void {
addItemAt(length, value);
}
function addItemAt(index:Number, value):Void {
if (index<length) {
splice(index, 0, value);
} else if (index>length) {
return;
}
this[index] = value;
}
function addItemsAt(index:Number, newItems:Array):Void {
index = Math.min(length, index);
newItems.unshift(index, 0);
splice.apply(this, newItems);
newItems.splice(0, 2);
}
function getItemAt(index:Number) {
return this[index];
}
function removeItemAt(index:Number) {
var ret = this[index];
removeItemsAt(index, 1);
return ret;
}
function removeItemsAt(index:Number, len:Number):Void {
splice(index, len);
}
function removeAll(Void):Void {
splice(0);
}
function replaceItemAt(index:Number, itemObj):Void {
if (index<0 || index>=length) return;
this[index] = itemObj;
}
public function contains(item):Boolean {
var result:Boolean;
if (item instanceof(Array)) result = (findItemsFromArray(item).length > 0);
else result = (findItem(item) > -1);
return result;
}
public function getIndicesOnItems():Array {
var arr:Array;
if (arguments.length > 1) {
arr = arguments;
} else if (arguments.length == 1) {
var obj = arguments[0];
arr = (obj instanceof(Array)) ? obj : [obj];
} else return;
return findItemsFromArray(arr);
}
public function findItem(item):Number {
var i = length;
while (i--) if (this[i] === item) return i;
return -1;
}
public function findItemsFromArray(arr:Array):Array {
var result:Array = new Array(arr.length);
var iLength:Number = length;
var jLength:Number = arr.length;
var found:Number = 0;
for (var i=0; i<iLength; i++) {
for (var j=0; (j < jLength) && (found < arr.length); j++) {
if (this[i] == arr[j]) {
result[j] = i;
found++;
break;
}
}
}
return (result.length > 0) ? result : null;
}
function sortItems(compareFunc, optionFlags):Void {
sort(compareFunc, optionFlags);
}
function sortItemsBy(fieldName, order):Void {
// old "asc" or "desc"
if (typeof(order)=="string") {
sortOn(fieldName);
if (order.toUpperCase()=="DESC") {
reverse();
}
} else {
sortOn(fieldName, order);
}
}
}