【问题标题】:How to generalize a function?如何泛化一个函数?
【发布时间】:2016-01-30 06:56:46
【问题描述】:

我正在使用以下函数,我试图在不使用硬编码值的情况下概括该函数。我怎样才能实现它?

function ChangeIDToString(strCondition,id)
        {
            if (strCondition.indexOf("AssignedTo") > -1)
                return GetUserName(id)
            else if (strCondition.indexOf("ClaimStatusId") > -1)
                return GetClaimStatus(id)
            else if (strCondition.indexOf("ClaimTypeId") > -1)
                return GetClaimType(id);           
            else
                return id;
        }

【问题讨论】:

  • strCondition 更改为user 作为方法参数,并将检查替换为if (user.AssignedTo) [....]
  • sn-p 与 JSON 有什么关系?
  • 你到底想用JSON object做什么?是JS……
  • 我需要使用json对象而不是javascript这是什么意思?
  • 我试图在不使用硬编码值的情况下概括该函数。我需要为此使用 json,但不确定我如何调用

标签: javascript


【解决方案1】:

很高兴看看你的函数做了什么。

但是在你的函数中,你可以声明:

var j={"id":"return of your function string here"};
JSON.stringify(j); // '{"id":"return of your function string here"}'

【讨论】:

  • 我需要在“返回你的函数字符串”这里写什么
  • 例如,GetUserName(id) 返回什么?如果它返回一个字符串,您可以让 GetUserName(id) 返回上述代码,其中“在此处返回您的函数字符串”将是您的 GetUserName(id) 函数通常返回的内容。
【解决方案2】:

您可以创建一个函数对象,然后使用括号表示法和动态属性名称调用以strCondition 命名的函数。像这样的:

var objOfFunctions = {
    GetUserName: function (id) {...},
    GetClaimStatus: function (id) {...},
    GetClaimType: function (id) {...}
};

function ChangeIDToString(strCondition,id) {
    if (!objOfFunctions.hasOwnProperty(strCondition)) {
        return id;
    }
    return objOfFunctions[strCondition](id);
}

如果您已经在代码中的其他位置多次调用 objOfFunctios 中的函数,您也可以使用引用填充该对象。

A live demo using references in objOfFunctions at jsFiddle.


编辑

在发现您之前也问过同样的问题后,看来我的原始答案仍然硬编码太多。 (Your comment void 的类似答案。)

仍然可以通过将函数引用而不是字符串传递给ChangeIDToString 来实现目标。尽管您将失去检查的能力,但将调用哪个函数。像这样:

function ChangeIDToString(refCondition,id) {
    if (typeof refCondition !== 'function') {
        return id;
    }
    return refCondition(id);
}
// Invoke example
console.log(ChangeIDToString(GetClaimType, 'some_ID'));

A demo at jsFiddle.

如果字符串不能被引用替换,你最后的办法是使用eval(),但强烈建议不要这样做

An eval demo at jsFiddle

【讨论】:

    【解决方案3】:

    您不清楚您希望 JSON 在哪里/如何适合您的解决方案,但如果您说肯定会有这 3 个字符串之一传递到函数中,并且从那里调用哪个函数是基于关于传入哪个字符串,那么您可以利用 JavaScript 中所有参数都是可选的这一事实。只要您的函数仅使用 2 个参数(id 和其他参数之一)调用,就可以做到:

    function ChangeIDToString(id, user, claimStatusId, claimTypeId)
    {
       if (user !== null)
           return GetUserName(id)
       else if (claimStatusId !== null)
           return GetClaimStatus(id)
       else if (claimTypeId !== null)
           return GetClaimType(id);           
       else
           return id;
    }
    

    https://jsfiddle.net/m271cpum/ 获取更完整的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2019-11-30
      • 2020-01-13
      • 1970-01-01
      相关资源
      最近更新 更多