Как сделать chaining для своего класса?

268
16 марта 2018, 15:48

Есть класс customArrayFunctions , метод chain работает как нужно, но функции повторяются, поэтому мне нужно чтобы после вызова chain брались функции из основного класа типа customArrayFunctions.chain([1,2,3]).take(1) функция take чтобы бралась из customArrayFunctions и массив чтобы подставлялся сразу, и нужно указать только n

"use strict";
var customArrayFunctions = (function() {
function isArrayNumber(arr) {
    for (var i = 0; i < arr.length; i++) {
        if (typeof arr[i] != "number") {
            return false;
        }
    }
    return true;
}
function take(arr, n) {
    if (Array.isArray(arr)) {
        return arr.slice(0, n);
    }
}
function skip(arr, n) {
    if (Array.isArray(arr)) {
        return arr.slice(n, arr.length);
    }
}
function map(arr, callback) {
    if (Array.isArray(arr)) {
        var length = arr.length,
            newarr = [];
        for (var i = 0; i < length; i = i + 1) {
            newarr.push(callback(i, arr[i]));
        }
        return newarr;
    }
}
function reduce(arr, callback, val) {
    if (Array.isArray(arr) && isArrayNumber(arr)) {
        var length = arr.length,
            newarr = [];
        for (var i = 0; i < length; i = i + 1) {
            newarr.push(callback(i, arr[i]) - val);
        }
        return newarr;
    }
}
function filter(arr, callback) {
    if (Array.isArray(arr)) {
        var length = arr.length,
            newarr = [];
        for (var i = 0; i < length; i = i + 1) {
            if (callback(i, arr[i])) {
                newarr.push(arr[i]);
            }
        }
        return newarr;
    }
}
function foreach(arr, callback) {
    if (Array.isArray(arr)) {
        var length = arr.length;
        for (var i = 0; i < length; i = i + 1) {
            arr[i] = callback(i, arr[i]) ? callback(i, arr[i]) : arr[i];
        }
    }
}
function chain(arr) {
    return {
        take: function(n) {
            arr = arr.slice(0, n);
            return this;
        },
        skip: function(n) {
            arr = arr.slice(n, arr.length);
            return this;
        },
        map: function(callback) {
            var length = arr.length,
                newarr = [];
            for (var i = 0; i < length; i = i + 1) {
                newarr.push(callback(i, arr[i]));
            }
            arr = newarr;
            return this;
        },
        reduce: function(callback, val) {
            var length = arr.length,
                newarr = [];
            for (var i = 0; i < length; i = i + 1) {
                newarr.push(callback(i, arr[i]) - val);
            }
            arr = newarr;
            return this;
        },
        filter: function(callback) {
            var length = arr.length,
                newarr = [];
            for (var i = 0; i < length; i = i + 1) {
                if (callback(i, arr[i])) {
                    newarr.push(arr[i]);
                }
            }
            arr = newarr;
            return this;
        },
        value: function() {
            return arr;
        }
    };
}
return {
    take: take,
    skip: skip,
    map: map,
    reduce: reduce,
    filter: filter,
    foreach: foreach,
    chain: chain
};
})();
Answer 1

customArrayFunctions.chain([1,2,3]).take(1)

У вас нет класса customArrayFunctions, у вас на выходе объект со свойствами указанные вот в этом куске кода:

return {
    take: take,
    skip: skip,
    map: map,
    reduce: reduce,
    filter: filter,
    foreach: foreach,
    chain: chain
};

При вызове customArrayFunctions.chain([1,2,3]) Вы получаете на выходе новый объект и обратите внимание Ваш массив нигде не используется, можете проверить customArrayFunctions.chain([1,2,3]).value().
Также непонятно зачем Вы везде указали return this, при вызове функций в данном случае контекст сохранится.

READ ALSO
JQuery autocomplete

JQuery autocomplete

Первый раз работаю с autocomplete, запутался в хламНа сайте есть готовый код, который из БД тянет города согласно первых символов, после выбора...

220
Vue, выползание формы

Vue, выползание формы

Подскажите, как сделать при клике на: <a class="btn btn-md btn-default ">Reply</a> чтобы выползала форма (примерно как на ютубе), нажимаешь на ответ, и выползает...

202
Установка coreui, без node.js

Установка coreui, без node.js

Имеется сервер apachСоздал страницу с подключением bootsrap, как подключить, установить coreui на свой проект, поверх bootstrap? Установка описанная на официальном...

256
Прокрутка Ползунка input[type=range] при достижении Div&#39;a

Прокрутка Ползунка input[type=range] при достижении Div'a

Есть Ползунок (input[type=range]) - как можно поменять его положение при достижении определеного Div'a - знаю что можно использовать pageYOffset - но для...

273