首页 > 解决方案 > 如何用函数包装子属性?

问题描述

我想用如下函数包装对象的每个子对象。

是否有任何解决方案可以制作一个功能或其他东西而不是手动执行此操作?

// current code
import authController from "./authController";
import appController from "./appController";
import userController from "./userController";
import postController from "./postController";
import { executeRequest } from "./utils";

const controllers = {
    user: { save: executeRequest(userController.save), 
            confirm: executeRequest(userController.confirm) },
    post: {
        save: executeRequest(postController.save),
    },
    auth: {
        signin: executeRequest(authController.signin),
        signout: executeRequest(authController.signout),
    },
    app: {
        get: executeRequest(appController.get)
    }

我想使用这样的对象

// expectation
import authController from "./authController";
import appController from "./appController";
import userController from "./userController";
import postController from "./postController";
import { executeRequest } from "./utils";

// do something here to wrap the children

const controllers = {
   user: userController,
    auth: authController,
    post: postController,
    app: appController
};

import controllers from "../controllers";

const postController = controllers.post;
router.post(Routes.DEFAULT, postController.save);

谢谢!

标签: javascripttypescriptalgorithmexpresshash

解决方案


您可以枚举所有导入中的所有属性并通过executeRequest函数发送它们。

let controllers = {
   user: userController,
    auth: authController,
    post: postController,
    app: appController
};


controllers = Object.keys(controllers).reduce((cAcc, cCurr) => {
   
    cAcc[cCurr] = Object.keys(controllers[cCurr]).reduce((mAcc, mCurr) => {

       mAcc[mCurr] = executeRequest(controllers[cCurr][mCurr]);
       return mAcc;

     }, {})

     return cAcc;
}, {})

此时,您的对象将拥有通过该函数controllers发送的所有控制器及其方法。executeRequest


推荐阅读