123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.lang.functional.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.lang.functional.array"] = true;
- dojo.provide("dojox.lang.functional.array");
- dojo.require("dojox.lang.functional.lambda");
- // This module adds high-level functions and related constructs:
- // - array-processing functions similar to standard JS functions
- // Notes:
- // - this module provides JS standard methods similar to high-level functions in dojo/_base/array.js:
- // forEach, map, filter, every, some
- // Defined methods:
- // - take any valid lambda argument as the functional argument
- // - operate on dense arrays
- // - take a string as the array argument
- // - take an iterator objects as the array argument
- (function(){
- var d = dojo, df = dojox.lang.functional, empty = {};
- d.mixin(df, {
- // JS 1.6 standard array functions, which can take a lambda as a parameter.
- // Consider using dojo._base.array functions, if you don't need the lambda support.
- filter: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: creates a new array with all elements that pass the test
- // implemented by the provided function.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var t = [], v, i, n;
- if(d.isArray(a)){
- // array
- for(i = 0, n = a.length; i < n; ++i){
- v = a[i];
- if(f.call(o, v, i, a)){ t.push(v); }
- }
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- for(i = 0; a.hasNext();){
- v = a.next();
- if(f.call(o, v, i++, a)){ t.push(v); }
- }
- }else{
- // object/dictionary
- for(i in a){
- if(!(i in empty)){
- v = a[i];
- if(f.call(o, v, i, a)){ t.push(v); }
- }
- }
- }
- return t; // Array
- },
- forEach: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: executes a provided function once per array element.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var i, n;
- if(d.isArray(a)){
- // array
- for(i = 0, n = a.length; i < n; f.call(o, a[i], i, a), ++i);
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- for(i = 0; a.hasNext(); f.call(o, a.next(), i++, a));
- }else{
- // object/dictionary
- for(i in a){
- if(!(i in empty)){
- f.call(o, a[i], i, a);
- }
- }
- }
- return o; // Object
- },
- map: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: creates a new array with the results of calling
- // a provided function on every element in this array.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var t, n, i;
- if(d.isArray(a)){
- // array
- t = new Array(n = a.length);
- for(i = 0; i < n; t[i] = f.call(o, a[i], i, a), ++i);
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- t = [];
- for(i = 0; a.hasNext(); t.push(f.call(o, a.next(), i++, a)));
- }else{
- // object/dictionary
- t = [];
- for(i in a){
- if(!(i in empty)){
- t.push(f.call(o, a[i], i, a));
- }
- }
- }
- return t; // Array
- },
- every: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: tests whether all elements in the array pass the test
- // implemented by the provided function.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var i, n;
- if(d.isArray(a)){
- // array
- for(i = 0, n = a.length; i < n; ++i){
- if(!f.call(o, a[i], i, a)){
- return false; // Boolean
- }
- }
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- for(i = 0; a.hasNext();){
- if(!f.call(o, a.next(), i++, a)){
- return false; // Boolean
- }
- }
- }else{
- // object/dictionary
- for(i in a){
- if(!(i in empty)){
- if(!f.call(o, a[i], i, a)){
- return false; // Boolean
- }
- }
- }
- }
- return true; // Boolean
- },
- some: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: tests whether some element in the array passes the test
- // implemented by the provided function.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var i, n;
- if(d.isArray(a)){
- // array
- for(i = 0, n = a.length; i < n; ++i){
- if(f.call(o, a[i], i, a)){
- return true; // Boolean
- }
- }
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- for(i = 0; a.hasNext();){
- if(f.call(o, a.next(), i++, a)){
- return true; // Boolean
- }
- }
- }else{
- // object/dictionary
- for(i in a){
- if(!(i in empty)){
- if(f.call(o, a[i], i, a)){
- return true; // Boolean
- }
- }
- }
- }
- return false; // Boolean
- }
- });
- })();
- }
|