@MaksZhukov
programer

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

Есть класс 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
    };
})();
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Есть такой вариант: chain будет возвращать Proxy с get-ловушкой, в которой проверяем имя запрашиваемого свойства, и если это один из методов, то возвращаем этот метод, обёрнутый в другой Proxy, где будет apply-ловушка с вызовом метода и оборачиванием результата в chain. Типа так.

А ещё можно заглянуть в исходники lodash, например, и посмотреть как чейнинг реализован там (по-другому, да).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы