aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.12/lib/sdk/util/array.js
blob: 764eeca53f80a586c80e8bd8a1e863b7e5c7881f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* vim:set ts=2 sw=2 sts=2 et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

module.metadata = {
  "stability": "experimental"
};

/**
 * Returns `true` if given `array` contain given `element` or `false`
 * otherwise.
 * @param {Array} array
 *    Target array.
 * @param {Object|String|Number|Boolean} element
 *    Element being looked up.
 * @returns {Boolean}
 */
var has = exports.has = function has(array, element) {
  // shorter and faster equivalent of `array.indexOf(element) >= 0`
  return !!~array.indexOf(element);
};
var hasAny = exports.hasAny = function hasAny(array, elements) {
  if (arguments.length < 2)
    return false;
  if (!Array.isArray(elements))
    elements = [ elements ];
  return array.some(function (element) {
      return has(elements, element);
  });
};

/**
 * Adds given `element` to the given `array` if it does not contain it yet.
 * `true` is returned if element was added otherwise `false` is returned.
 * @param {Array} array
 *    Target array.
 * @param {Object|String|Number|Boolean} element
 *    Element to be added.
 * @returns {Boolean}
 */
var add = exports.add = function add(array, element) {
  var result;
  if ((result = !has(array, element)))
    array.push(element);

  return result;
};

/**
 * Removes first occurrence of the given `element` from the given `array`. If
 * `array` does not contain given `element` `false` is returned otherwise
 * `true` is returned.
 * @param {Array} array
 *    Target array.
 * @param {Object|String|Number|Boolean} element
 *    Element to be removed.
 * @returns {Boolean}
 */
exports.remove = function remove(array, element) {
  var result;
  if ((result = has(array, element)))
    array.splice(array.indexOf(element), 1);

  return result;
};

/**
 * Produces a duplicate-free version of the given `array`.
 * @param {Array} array
 *    Source array.
 * @returns {Array}
 */
exports.unique = function unique(array) {
  var value = [];
  return array.forEach(function(element) {
    add(value, element);
  });
  return value;
};

exports.flatten = function flatten(array){
   var flat = [];
   for (var i = 0, l = array.length; i < l; i++) {
    flat = flat.concat(Array.isArray(array[i]) ? flatten(array[i]) : array[i]);
   }
   return flat;
};