173 lines
4.1 KiB
JavaScript
173 lines
4.1 KiB
JavaScript
![]() |
/*
|
||
|
Copyright (c) 2004-2006, The Dojo Foundation
|
||
|
All Rights Reserved.
|
||
|
|
||
|
Licensed under the Academic Free License version 2.1 or above OR the
|
||
|
modified BSD license. For more information on Dojo licensing, see:
|
||
|
|
||
|
http://dojotoolkit.org/community/licensing.shtml
|
||
|
*/
|
||
|
|
||
|
dojo.provide("dojo.lang.array");
|
||
|
|
||
|
dojo.require("dojo.lang.common");
|
||
|
|
||
|
// FIXME: Is this worthless since you can do: if(name in obj)
|
||
|
// is this the right place for this?
|
||
|
dojo.lang.has = function(obj, name){
|
||
|
try{
|
||
|
return (typeof obj[name] != "undefined");
|
||
|
}catch(e){ return false; }
|
||
|
}
|
||
|
|
||
|
dojo.lang.isEmpty = function(obj) {
|
||
|
if(dojo.lang.isObject(obj)) {
|
||
|
var tmp = {};
|
||
|
var count = 0;
|
||
|
for(var x in obj){
|
||
|
if(obj[x] && (!tmp[x])){
|
||
|
count++;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return (count == 0);
|
||
|
} else if(dojo.lang.isArrayLike(obj) || dojo.lang.isString(obj)) {
|
||
|
return obj.length == 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dojo.lang.map = function(arr, obj, unary_func){
|
||
|
var isString = dojo.lang.isString(arr);
|
||
|
if(isString){
|
||
|
arr = arr.split("");
|
||
|
}
|
||
|
if(dojo.lang.isFunction(obj)&&(!unary_func)){
|
||
|
unary_func = obj;
|
||
|
obj = dj_global;
|
||
|
}else if(dojo.lang.isFunction(obj) && unary_func){
|
||
|
// ff 1.5 compat
|
||
|
var tmpObj = obj;
|
||
|
obj = unary_func;
|
||
|
unary_func = tmpObj;
|
||
|
}
|
||
|
if(Array.map){
|
||
|
var outArr = Array.map(arr, unary_func, obj);
|
||
|
}else{
|
||
|
var outArr = [];
|
||
|
for(var i=0;i<arr.length;++i){
|
||
|
outArr.push(unary_func.call(obj, arr[i]));
|
||
|
}
|
||
|
}
|
||
|
if(isString) {
|
||
|
return outArr.join("");
|
||
|
} else {
|
||
|
return outArr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach
|
||
|
dojo.lang.forEach = function(anArray /* Array */, callback /* Function */, thisObject /* Object */){
|
||
|
if(dojo.lang.isString(anArray)){
|
||
|
anArray = anArray.split("");
|
||
|
}
|
||
|
if(Array.forEach){
|
||
|
Array.forEach(anArray, callback, thisObject);
|
||
|
}else{
|
||
|
// FIXME: there are several ways of handilng thisObject. Is dj_global always the default context?
|
||
|
if(!thisObject){
|
||
|
thisObject=dj_global;
|
||
|
}
|
||
|
for(var i=0,l=anArray.length; i<l; i++){
|
||
|
callback.call(thisObject, anArray[i], i, anArray);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dojo.lang._everyOrSome = function(every, arr, callback, thisObject){
|
||
|
if(dojo.lang.isString(arr)){
|
||
|
arr = arr.split("");
|
||
|
}
|
||
|
if(Array.every){
|
||
|
return Array[ (every) ? "every" : "some" ](arr, callback, thisObject);
|
||
|
}else{
|
||
|
if(!thisObject){
|
||
|
thisObject = dj_global;
|
||
|
}
|
||
|
for(var i=0,l=arr.length; i<l; i++){
|
||
|
var result = callback.call(thisObject, arr[i], i, arr);
|
||
|
if((every)&&(!result)){
|
||
|
return false;
|
||
|
}else if((!every)&&(result)){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return (every) ? true : false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dojo.lang.every = function(arr, callback, thisObject){
|
||
|
return this._everyOrSome(true, arr, callback, thisObject);
|
||
|
}
|
||
|
|
||
|
dojo.lang.some = function(arr, callback, thisObject){
|
||
|
return this._everyOrSome(false, arr, callback, thisObject);
|
||
|
}
|
||
|
|
||
|
dojo.lang.filter = function(arr, callback, thisObject) {
|
||
|
var isString = dojo.lang.isString(arr);
|
||
|
if(isString) { arr = arr.split(""); }
|
||
|
if(Array.filter) {
|
||
|
var outArr = Array.filter(arr, callback, thisObject);
|
||
|
} else {
|
||
|
if(!thisObject) {
|
||
|
if(arguments.length >= 3) { dojo.raise("thisObject doesn't exist!"); }
|
||
|
thisObject = dj_global;
|
||
|
}
|
||
|
|
||
|
var outArr = [];
|
||
|
for(var i = 0; i < arr.length; i++) {
|
||
|
if(callback.call(thisObject, arr[i], i, arr)) {
|
||
|
outArr.push(arr[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(isString) {
|
||
|
return outArr.join("");
|
||
|
} else {
|
||
|
return outArr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a 1-D array out of all the arguments passed,
|
||
|
* unravelling any array-like objects in the process
|
||
|
*
|
||
|
* Ex:
|
||
|
* unnest(1, 2, 3) ==> [1, 2, 3]
|
||
|
* unnest(1, [2, [3], [[[4]]]]) ==> [1, 2, 3, 4]
|
||
|
*/
|
||
|
dojo.lang.unnest = function(/* ... */) {
|
||
|
var out = [];
|
||
|
for(var i = 0; i < arguments.length; i++) {
|
||
|
if(dojo.lang.isArrayLike(arguments[i])) {
|
||
|
var add = dojo.lang.unnest.apply(this, arguments[i]);
|
||
|
out = out.concat(add);
|
||
|
} else {
|
||
|
out.push(arguments[i]);
|
||
|
}
|
||
|
}
|
||
|
return out;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts an array-like object (i.e. arguments, DOMCollection)
|
||
|
* to an array
|
||
|
**/
|
||
|
dojo.lang.toArray = function(arrayLike, startOffset) {
|
||
|
var array = [];
|
||
|
for(var i = startOffset||0; i < arrayLike.length; i++) {
|
||
|
array.push(arrayLike[i]);
|
||
|
}
|
||
|
return array;
|
||
|
}
|