[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/yuilib/3.17.2/array-extras/ -> array-extras-debug.js (source)

   1  /*
   2  YUI 3.17.2 (build 9c3c78e)
   3  Copyright 2014 Yahoo! Inc. All rights reserved.
   4  Licensed under the BSD License.
   5  http://yuilibrary.com/license/
   6  */
   7  
   8  YUI.add('array-extras', function (Y, NAME) {
   9  
  10  /**
  11  Adds additional utility methods to the `Y.Array` class.
  12  
  13  @module collection
  14  @submodule array-extras
  15  **/
  16  
  17  var A          = Y.Array,
  18      L          = Y.Lang,
  19      ArrayProto = Array.prototype;
  20  
  21  /**
  22  Returns the index of the last item in the array that contains the specified
  23  value, or `-1` if the value isn't found.
  24  
  25  @method lastIndexOf
  26  @param {Array} a Array to search in.
  27  @param {Any} val Value to search for.
  28  @param {Number} [fromIndex] Index at which to start searching backwards.
  29    Defaults to the array's length - 1. If negative, it will be taken as an offset
  30    from the end of the array. If the calculated index is less than 0, the array
  31    will not be searched and `-1` will be returned.
  32  @return {Number} Index of the item that contains the value, or `-1` if not
  33    found.
  34  @static
  35  @for Array
  36  **/
  37  A.lastIndexOf = L._isNative(ArrayProto.lastIndexOf) ?
  38      function(a, val, fromIndex) {
  39          // An undefined fromIndex is still considered a value by some (all?)
  40          // native implementations, so we can't pass it unless it's actually
  41          // specified.
  42          return fromIndex || fromIndex === 0 ? a.lastIndexOf(val, fromIndex) :
  43                  a.lastIndexOf(val);
  44      } :
  45      function(a, val, fromIndex) {
  46          var len = a.length,
  47              i   = len - 1;
  48  
  49          if (fromIndex || fromIndex === 0) {
  50              i = Math.min(fromIndex < 0 ? len + fromIndex : fromIndex, len);
  51          }
  52  
  53          if (i > -1 && len > 0) {
  54              for (; i > -1; --i) {
  55                  if (i in a && a[i] === val) {
  56                      return i;
  57                  }
  58              }
  59          }
  60  
  61          return -1;
  62      };
  63  
  64  /**
  65  Returns a copy of the input array with duplicate items removed.
  66  
  67  Note: If the input array only contains strings, the `Y.Array.dedupe()` method is
  68  a much faster alternative.
  69  
  70  @method unique
  71  @param {Array} array Array to dedupe.
  72  @param {Function} [testFn] Custom function to use to test the equality of two
  73      values. A truthy return value indicates that the values are equal. A falsy
  74      return value indicates that the values are not equal.
  75  
  76      @param {Any} testFn.a First value to compare.
  77      @param {Any} testFn.b Second value to compare.
  78      @param {Number} testFn.index Index of the current item in the original
  79          array.
  80      @param {Array} testFn.array The original array.
  81      @return {Boolean} _true_ if the items are equal, _false_ otherwise.
  82  
  83  @return {Array} Copy of the input array with duplicate items removed.
  84  @static
  85  **/
  86  A.unique = function (array, testFn) {
  87      var i       = 0,
  88          len     = array.length,
  89          results = [],
  90          j, result, resultLen, value;
  91  
  92      // Note the label here. It's used to jump out of the inner loop when a value
  93      // is not unique.
  94      outerLoop: for (; i < len; i++) {
  95          value = array[i];
  96  
  97          // For each value in the input array, iterate through the result array
  98          // and check for uniqueness against each result value.
  99          for (j = 0, resultLen = results.length; j < resultLen; j++) {
 100              result = results[j];
 101  
 102              // If the test function returns true or there's no test function and
 103              // the value equals the current result item, stop iterating over the
 104              // results and continue to the next value in the input array.
 105              if (testFn) {
 106                  if (testFn.call(array, value, result, i, array)) {
 107                      continue outerLoop;
 108                  }
 109              } else if (value === result) {
 110                  continue outerLoop;
 111              }
 112          }
 113  
 114          // If we get this far, that means the current value is not already in
 115          // the result array, so add it.
 116          results.push(value);
 117      }
 118  
 119      return results;
 120  };
 121  
 122  /**
 123  Executes the supplied function on each item in the array. Returns a new array
 124  containing the items for which the supplied function returned a truthy value.
 125  
 126  @method filter
 127  @param {Array} a Array to filter.
 128  @param {Function} f Function to execute on each item.
 129  @param {Object} [o] Optional context object.
 130  @return {Array} Array of items for which the supplied function returned a
 131    truthy value (empty if it never returned a truthy value).
 132  @static
 133  */
 134  A.filter = L._isNative(ArrayProto.filter) ?
 135      function(a, f, o) {
 136          return ArrayProto.filter.call(a, f, o);
 137      } :
 138      function(a, f, o) {
 139          var i       = 0,
 140              len     = a.length,
 141              results = [],
 142              item;
 143  
 144          for (; i < len; ++i) {
 145              if (i in a) {
 146                  item = a[i];
 147  
 148                  if (f.call(o, item, i, a)) {
 149                      results.push(item);
 150                  }
 151              }
 152          }
 153  
 154          return results;
 155      };
 156  
 157  /**
 158  The inverse of `Array.filter()`. Executes the supplied function on each item.
 159  Returns a new array containing the items for which the supplied function
 160  returned `false`.
 161  
 162  @method reject
 163  @param {Array} a the array to iterate.
 164  @param {Function} f the function to execute on each item.
 165  @param {object} [o] Optional context object.
 166  @return {Array} The items for which the supplied function returned `false`.
 167  @static
 168  */
 169  A.reject = function(a, f, o) {
 170      return A.filter(a, function(item, i, a) {
 171          return !f.call(o, item, i, a);
 172      });
 173  };
 174  
 175  /**
 176  Executes the supplied function on each item in the array. Iteration stops if the
 177  supplied function does not return a truthy value.
 178  
 179  @method every
 180  @param {Array} a the array to iterate.
 181  @param {Function} f the function to execute on each item.
 182  @param {Object} [o] Optional context object.
 183  @return {Boolean} `true` if every item in the array returns `true` from the
 184    supplied function, `false` otherwise.
 185  @static
 186  */
 187  A.every = L._isNative(ArrayProto.every) ?
 188      function(a, f, o) {
 189          return ArrayProto.every.call(a, f, o);
 190      } :
 191      function(a, f, o) {
 192          for (var i = 0, l = a.length; i < l; ++i) {
 193              if (i in a && !f.call(o, a[i], i, a)) {
 194                  return false;
 195              }
 196          }
 197  
 198          return true;
 199      };
 200  
 201  /**
 202  Executes the supplied function on each item in the array and returns a new array
 203  containing all the values returned by the supplied function.
 204  
 205  @example
 206  
 207      // Convert an array of numbers into an array of strings.
 208      Y.Array.map([1, 2, 3, 4], function (item) {
 209        return '' + item;
 210      });
 211      // => ['1', '2', '3', '4']
 212  
 213  @method map
 214  @param {Array} a the array to iterate.
 215  @param {Function} f the function to execute on each item.
 216  @param {object} [o] Optional context object.
 217  @return {Array} A new array containing the return value of the supplied function
 218    for each item in the original array.
 219  @static
 220  */
 221  A.map = L._isNative(ArrayProto.map) ?
 222      function(a, f, o) {
 223          return ArrayProto.map.call(a, f, o);
 224      } :
 225      function(a, f, o) {
 226          var i       = 0,
 227              len     = a.length,
 228              results = ArrayProto.concat.call(a);
 229  
 230          for (; i < len; ++i) {
 231              if (i in a) {
 232                  results[i] = f.call(o, a[i], i, a);
 233              }
 234          }
 235  
 236          return results;
 237      };
 238  
 239  
 240  /**
 241  Executes the supplied function on each item in the array, "folding" the array
 242  into a single value.
 243  
 244  @method reduce
 245  @param {Array} a Array to iterate.
 246  @param {Any} init Initial value to start with.
 247  @param {Function} f Function to execute on each item. This function should
 248    update and return the value of the computation. It will receive the following
 249    arguments:
 250      @param {Any} f.previousValue Value returned from the previous iteration,
 251        or the initial value if this is the first iteration.
 252      @param {Any} f.currentValue Value of the current item being iterated.
 253      @param {Number} f.index Index of the current item.
 254      @param {Array} f.array Array being iterated.
 255  @param {Object} [o] Optional context object.
 256  @return {Any} Final result from iteratively applying the given function to each
 257    element in the array.
 258  @static
 259  */
 260  A.reduce = L._isNative(ArrayProto.reduce) ?
 261      function(a, init, f, o) {
 262          // ES5 Array.reduce doesn't support a thisObject, so we need to
 263          // implement it manually.
 264          return ArrayProto.reduce.call(a, function(init, item, i, a) {
 265              return f.call(o, init, item, i, a);
 266          }, init);
 267      } :
 268      function(a, init, f, o) {
 269          var i      = 0,
 270              len    = a.length,
 271              result = init;
 272  
 273          for (; i < len; ++i) {
 274              if (i in a) {
 275                  result = f.call(o, result, a[i], i, a);
 276              }
 277          }
 278  
 279          return result;
 280      };
 281  
 282  /**
 283  Executes the supplied function on each item in the array, searching for the
 284  first item that matches the supplied function.
 285  
 286  @method find
 287  @param {Array} a the array to search.
 288  @param {Function} f the function to execute on each item. Iteration is stopped
 289    as soon as this function returns `true`.
 290  @param {Object} [o] Optional context object.
 291  @return {Object} the first item that the supplied function returns `true` for,
 292    or `null` if it never returns `true`.
 293  @static
 294  */
 295  A.find = function(a, f, o) {
 296      for (var i = 0, l = a.length; i < l; i++) {
 297          if (i in a && f.call(o, a[i], i, a)) {
 298              return a[i];
 299          }
 300      }
 301      return null;
 302  };
 303  
 304  /**
 305  Iterates over an array, returning a new array of all the elements that match the
 306  supplied regular expression.
 307  
 308  @method grep
 309  @param {Array} a Array to iterate over.
 310  @param {RegExp} pattern Regular expression to test against each item.
 311  @return {Array} All the items in the array that produce a match against the
 312    supplied regular expression. If no items match, an empty array is returned.
 313  @static
 314  */
 315  A.grep = function(a, pattern) {
 316      return A.filter(a, function(item, index) {
 317          return pattern.test(item);
 318      });
 319  };
 320  
 321  /**
 322  Partitions an array into two new arrays, one with the items for which the
 323  supplied function returns `true`, and one with the items for which the function
 324  returns `false`.
 325  
 326  @method partition
 327  @param {Array} a Array to iterate over.
 328  @param {Function} f Function to execute for each item in the array. It will
 329    receive the following arguments:
 330      @param {Any} f.item Current item.
 331      @param {Number} f.index Index of the current item.
 332      @param {Array} f.array The array being iterated.
 333  @param {Object} [o] Optional execution context.
 334  @return {Object} An object with two properties: `matches` and `rejects`. Each is
 335    an array containing the items that were selected or rejected by the test
 336    function (or an empty array if none).
 337  @static
 338  */
 339  A.partition = function(a, f, o) {
 340      var results = {
 341          matches: [],
 342          rejects: []
 343      };
 344  
 345      A.each(a, function(item, index) {
 346          var set = f.call(o, item, index, a) ? results.matches : results.rejects;
 347          set.push(item);
 348      });
 349  
 350      return results;
 351  };
 352  
 353  /**
 354  Creates an array of arrays by pairing the corresponding elements of two arrays
 355  together into a new array.
 356  
 357  @method zip
 358  @param {Array} a Array to iterate over.
 359  @param {Array} a2 Another array whose values will be paired with values of the
 360    first array.
 361  @return {Array} An array of arrays formed by pairing each element of the first
 362    array with an item in the second array having the corresponding index.
 363  @static
 364  */
 365  A.zip = function(a, a2) {
 366      var results = [];
 367      A.each(a, function(item, index) {
 368          results.push([item, a2[index]]);
 369      });
 370      return results;
 371  };
 372  
 373  /**
 374  Flattens an array of nested arrays at any abitrary depth into a single, flat
 375  array.
 376  
 377  @method flatten
 378  @param {Array} a Array with nested arrays to flatten.
 379  @return {Array} An array whose nested arrays have been flattened.
 380  @static
 381  @since 3.7.0
 382  **/
 383  A.flatten = function(a) {
 384      var result = [],
 385          i, len, val;
 386  
 387      // Always return an array.
 388      if (!a) {
 389          return result;
 390      }
 391  
 392      for (i = 0, len = a.length; i < len; ++i) {
 393          val = a[i];
 394  
 395          if (L.isArray(val)) {
 396              // Recusively flattens any nested arrays.
 397              result.push.apply(result, A.flatten(val));
 398          } else {
 399              result.push(val);
 400          }
 401      }
 402  
 403      return result;
 404  };
 405  
 406  
 407  }, '3.17.2', {"requires": ["yui-base"]});


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1