【问题标题】:What is the Javascript equivalent of Python's get method for dictionariesPython的字典get方法的Javascript等价物是什么
【发布时间】:2017-05-25 15:54:56
【问题描述】:

Python 的字典 get 方法让我可以指定如果键不存在应该返回什么。对于我目前的情况,我想要返回字典。我如何在 Javascript 中做到这一点?

【问题讨论】:

标签: javascript


【解决方案1】:

使用现代 javascript,您可以使用 ?? operator

const result = obj[key] ?? default;

请注意,{myKey: undefined}{myKey: null} 之类的情况也会返回默认值,这可能是也可能不是所需的行为。

【讨论】:

    【解决方案2】:

    JavaScript 没有帮助功能来做到这一点。你需要明确地测试。

    if ("myProperty" in myObject) {
        return { another: "object" };
    } else {
        return myObject.myProperty;
    }
    

    您可以使用三元运算符用更少的代码做同样的事情。

    return ("myProperty" in myObject) ? myObject.myProperty : { another: "object" };
    

    【讨论】:

    【解决方案3】:

    您可以为此使用代理(非常新):

    var handler = {
        get: function(target, name){
            return name in target?
            target[name] :
            "Default";
        }
    };
    var dictionary={"hi":true};
    var dict = new Proxy(dictionary, handler);
    dict.a = 1;
    dict.b = undefined;
    
    console.log(dict.a, dict.b,dict.hi); // 1, undefined,true
    console.log(dict.new); //"Default"
    
     //the proxied object gets changed:
    
    console.log(dictionary.a, dictionary.b,dictionary.hi); // 1, undefined,true
    console.log(dictionary.new); //undefined
    

    代理是通过处理程序反映所有更改和请求的对象。在这种情况下,我们可以正常写入/访问字典的属性,但是如果我们访问不存在的值,它将返回“默认”

    【讨论】:

    【解决方案4】:

    没有与 python 字典 get 方法等效的 javascript。如果你自己写它,作为一个函数,它看起来像这样:

    function get(object, key, default_value) {
        var result = object[key];
        return (typeof result !== "undefined") ? result : default_value;
    }
    

    像这样使用它:

    var obj = {"a": 1};
    get(obj, "a", 2); // -> 1
    get(obj, "b", 2); // -> 2
    

    请注意,请求的密钥也将在 obj 的原型中找到。

    如果你真的想要一个方法而不是一个函数(obj.get("a", 2)),你需要扩展 Object 的原型。不过,这通常被认为是个坏主意,请参阅 Extending Object.prototype JavaScript

    【讨论】:

    • 我非常喜欢这个解决方案的可读性。谢谢!
    【解决方案5】:

    我更喜欢像这样使用逻辑或:

    foo.bar || 'default'
    

    如果检查是 foo.bar 是假的,所以如果 bar 未定义,则返回“默认”。

    你只需要关心, foo 是一个对象。否则会抛出 ReferenceError。

    【讨论】:

    • 斯图尔特的回答更好。这将返回任何错误的默认值。斯图尔特的人只对无效的事情这样做。
    【解决方案6】:

    这对我有用

    let obj = {"a": 1};
    let default = 100
    obj["a"] || default; // -> 1
    obj["b"] || default; // -> 100
    

    但是!有一些限制,如果!!obj["a"] === false 我们总是得到默认值...所以最好只检查是否在 obj 中键入,以完全确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 2016-07-04
      • 1970-01-01
      • 2017-12-25
      • 2011-05-05
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多