| /* |
| 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"); |
| dojo.lang.mixin(dojo.lang, {has:function (obj, name) { |
| try { |
| return typeof obj[name] != "undefined"; |
| } |
| catch (e) { |
| return false; |
| } |
| }, 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; |
| } |
| } |
| }, 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) { |
| 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; |
| } |
| }, reduce:function (arr, initialValue, obj, binary_func) { |
| var reducedValue = initialValue; |
| if (arguments.length == 2) { |
| binary_func = initialValue; |
| reducedValue = arr[0]; |
| arr = arr.slice(1); |
| } else { |
| if (arguments.length == 3) { |
| if (dojo.lang.isFunction(obj)) { |
| binary_func = obj; |
| obj = null; |
| } |
| } else { |
| if (dojo.lang.isFunction(obj)) { |
| var tmp = binary_func; |
| binary_func = obj; |
| obj = tmp; |
| } |
| } |
| } |
| var ob = obj || dj_global; |
| dojo.lang.map(arr, function (val) { |
| reducedValue = binary_func.call(ob, reducedValue, val); |
| }); |
| return reducedValue; |
| }, forEach:function (anArray, callback, thisObject) { |
| if (dojo.lang.isString(anArray)) { |
| anArray = anArray.split(""); |
| } |
| if (Array.forEach) { |
| Array.forEach(anArray, callback, thisObject); |
| } else { |
| if (!thisObject) { |
| thisObject = dj_global; |
| } |
| for (var i = 0, l = anArray.length; i < l; i++) { |
| callback.call(thisObject, anArray[i], i, anArray); |
| } |
| } |
| }, _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 Boolean(every); |
| } |
| }, every:function (arr, callback, thisObject) { |
| return this._everyOrSome(true, arr, callback, thisObject); |
| }, some:function (arr, callback, thisObject) { |
| return this._everyOrSome(false, arr, callback, thisObject); |
| }, filter:function (arr, callback, thisObject) { |
| var isString = dojo.lang.isString(arr); |
| if (isString) { |
| arr = arr.split(""); |
| } |
| var outArr; |
| if (Array.filter) { |
| outArr = Array.filter(arr, callback, thisObject); |
| } else { |
| if (!thisObject) { |
| if (arguments.length >= 3) { |
| dojo.raise("thisObject doesn't exist!"); |
| } |
| thisObject = dj_global; |
| } |
| 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; |
| } |
| }, 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; |
| }, toArray:function (arrayLike, startOffset) { |
| var array = []; |
| for (var i = startOffset || 0; i < arrayLike.length; i++) { |
| array.push(arrayLike[i]); |
| } |
| return array; |
| }}); |
| |