Source: array.js

definer('array', /** @exports array */ function(is, object) {

    /**
     * Модуль работы с массивами.
     *
     * @class
     */
    function array() {}

    /**
     * Добавить элементы в массив без повтора.
     * Дополненный аналог стандартного метода `Array.prototype.push`.
     *
     * @param {array} arr Массив
     * @param {...*} element Элементы для добавления
     * @returns {number} Количество элементов в массиве
     */
    array.pushOnce = function(arr, element) {
        var elements = Array.prototype.slice.call(arguments, 1);
        for(var i = 0; i < elements.length; i++) {
            if(!~arr.indexOf(elements[i])) {
                arr.push(elements[i]);
            }
        }
        return arr.length;
    };

    /**
     * Добавить отдельные элементы и элементы других массивов в массив без повтора.
     * Дополненный аналог стандартного метода `Array.prototype.concat`.
     *
     * @param {array} arr Массив
     * @param {...*} element Элементы для добавления
     * @returns {array} Новый массив
     */
    array.concatOnce = function(arr, element) {
        var elements = Array.prototype.slice.call(arguments, 1),
            newArr = arr.slice();

        for(var i = 0; i < elements.length; i++) {
            if(is.array(elements[i])) {
                for(var j = 0; j < elements[i].length; j++) {
                    this.pushOnce(newArr, elements[i][j]);
                }
            } else {
                this.pushOnce(newArr, elements[i]);
            }
        }

        return newArr;
    };

    /**
     * Клонировать массив.
     *
     * @param {array} arr Массив
     * @returns {array} Новый массив
     */
    array.clone = function(arr) {
        return arr.slice();
    };

    /**
     * Клонировать массив рекурсивно.
     *
     * @param {array} arr Массив
     * @returns {array} Новый массив
     */
    array.deepClone = function(arr) {
        var clone = [];
        for(var i = 0, len = arr.length; i < len; i++) {
            var elem = arr[i];

            if(is.array(elem)) {
                elem = array.deepClone(elem);
            } else if(is.map(elem)) {
                elem = object.deepClone(elem);
            }

            clone.push(elem);
        }
        return clone;
    };

    return array;

});