【问题标题】:Javascript inline replace undefined with empty stringJavascript内联用空字符串替换未定义
【发布时间】:2016-12-13 16:33:03
【问题描述】:

我有这个功能:

function callWS(input) {
    var output = {
        "type"  : input["type"]  || "",
        "mark"  : input["mark"]  || "",
        "model" : input["model"] || "",
        "year"  : input["year"]  || ""
    };

    return output;
}

我希望用户以多种方式调用此函数:

callWS(); ==> {"type":"","mark":"","model":"","year":""}
callWS({"type":"moto"}); ==> {"type":"moto","mark":"","model":"","year":""}
callWS({"type":"moto","mark":"audi"}); ==> {"type":"moto","mark":"audi","model":"","year":""}

如果参数未定义,则将其初始化为空字符串。目前我的功能在第一种情况下不起作用,但在另一种情况下起作用。

当我像 callWS() 这样称呼它时,我得到:

Uncaught TypeError: Cannot read property 'type' of undefined

老实说,我不知道为什么它适用于 2 和 3 案例,但我需要让它也适用于第一个案例。我知道,如果我使用:

if (input["type"])

可以解决问题,但我需要一个内联解决方案。这有可能吗?

【问题讨论】:

  • 您也必须为input 本身提供默认值。只需将input = input || {} 添加到callWS 的开头
  • 将你的函数定义为function callWS(input = {})。
  • @torazaburo - 该项目不包含 ES6
  • @François Wahl - 不幸的是,该项目不使用 jQuery,它不使用任何外部库。
  • @paulalexandru 因此部分,如果您不使用 jQuery,您可以轻松编写自己的 :) 我在我的示例中也只使用了 JavaScript,但无论如何您已经对其进行了排序 :)

标签: javascript string undefined ternary-operator


【解决方案1】:

您也必须为 input 变量本身提供默认值。

function callWS(input) {
   input = input || {};
   ...
}

否则,您访问不存在(未定义)对象的属性会导致错误(您现在拥有的)。

另一方面,访问现有对象上不存在的属性在 JS 中不会被视为错误。

【讨论】:

  • 是的@torazaburo,但他希望对象具有已创建且未定义的属性
  • @torazaburo 好的,现在我明白了,抱歉,树点让我弄错了
【解决方案2】:

您可以编写自己的extend 方法并使用它。 这样你就可以有一个默认对象,给它任何默认值,然后将它与传递给函数的对象合并。

function extend(a, b){
    for(var key in b){
        if(b.hasOwnProperty(key)){
            a[key] = b[key];
        }
    }

    return a;
}

function callWS(input) {
    var defaultInput = {
        "type": "",
        "mark": "",
        "model":"",
        "year": ""
    }
    
    var output = extend(defaultInput, input);

    return output;
}

console.log(callWS());
console.log(callWS({"type":"moto"}));
console.log(callWS({"type":"moto","mark":"audi"}));

【讨论】:

    【解决方案3】:

    在 ES6 中,写成

    function callWS({type = "", mark = "", model = "", year = ""} = {}) {
      return {type, mark, model, year};
    }
    

    这是另一种不涉及 ES6 的方法。许多库包含一个default 实用程序,如果缺少某些属性,它将应用到另一个对象。

    function deflt(obj, defaults) {
      var keys = Object.keys(defaults);
      for (var i = 0; i < keys.length: i++) {
        var key = keys[i];
        if (!(key in obj)) obj[key] = defaults[key];
      }
      return obj;
    }
    

    你可以这样使用:

    function callWS(input) {
      input = input || {};
      deflt(input, {type: "", mark: "", model: "", year: ""});
      return input;
    }
    

    注意:正如所写,这将返回输入的修改版本。如果这不是您想要的,请根据需要进行调整。

    【讨论】:

    • 可惜项目没有使用ES6
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多