31

在 Python 中,对于字典d

d.setdefault('key', value)

设置d['key'] = valueif 'key'was not in d,否则保持原样。

是否有一种干净、惯用的方式在 Javascript 对象上执行此操作,或者是否需要if声明?

4

6 回答 6

26
if (!('key' in d)) d.key = value;

或者

'key' in d || (d.key = value);

(最后一个使用条件表达式的短路行为。)


d.key || (d.key = value)另一个答案中建议的“ ”是错误的:如果一个元素存在但计算结果为false( false, null, 0, -0, "", undefined,NaN ),它将被静默覆盖。

  • 虽然这可能是有意的,但很可能并非针对所有上述情况。因此,在这种情况下,请分别检查这些值:

    if (!('key' in d) || d.key === null) d.key = value;
    
于 2013-04-19T15:58:42.890 回答
14

它基本上就像使用一个if语句,但更短:

d.key || (d.key = value);

或者

d.key = d.key || value;

更新:正如@bobtato 所指出的,如果属性已经设置为false它将覆盖它的值,那么更好的方法是:

!d.key && d.key !== false && (d.key = value);

或者,按照他的建议去做(只是简写版本):

'key' in d || (d.key = value);

// including overwriting null values:

('key' in d && d.key !== null) || (d.key = value);
于 2013-04-19T15:06:40.070 回答
7

没有内置任何东西,但是这个函数可以做到:

function setDefault(obj, prop, deflt) {
  return obj.hasOwnProperty(prop) ? obj[prop] : (obj[prop] = deflt);
}

Ifobj将只包含非虚假值,obj[prop] || (obj[prop] = deflt)是一个很好的简单替代方案(但deflt会覆盖任何虚假值)。这有一个额外的优势,即deflt只有在需要它的值时才会被评估,所以它是一个昂贵的表达式是可以的。

于 2015-10-05T20:29:21.827 回答
7

现在你也可以做d.key ??= value

于 2020-10-30T13:05:39.497 回答
6

不推荐,也不是增加内置类的好主意。相反,最好创建自己的内置类实现,就像 YUI 库所做的(YArray 等)一样。但是,我要反驳这一点,因为我经常发现像这样实现有用的捷径对于编写干净的可维护代码是有好处的:

if (undefined === Object.prototype.setdefault) {
    Object.prototype.setdefault = function(key, def) {
        if (! this.hasOwnProperty(key)) {
            this[key] = def;
        }
        return this[key];
    };
}

所以让我们看看它的实际效果......

var a = {};

a.setdefault('mylist', []).push(1);
a.setdefault('mylist', []).push(2);

console.log(a.mylist.toString());
    1,2

正如已经指出的那样,使用它从来都不是一个好主意,thing = thing || defaultThing因为它只测试true, or的非类型相等性thing == true。与类型相等相反:thing === truething !== undefined. 因此,以内联方式正确编码的唯一方法是setdefault在任何地方使用此代码段:

/* null == thing is equivalent to... */
if (undefined !== thing && null !== thing) {
    thing = defaultThing;
}
/* ...but it's not explicit and linters don't like it! */

但正如我已经说过的,这只会给你的代码增加臃肿,并且容易出现从“复制粘贴”综合症中获得的错误。

于 2015-02-22T19:58:22.360 回答
2
a={}
key='3'
value = 2
a[key] = a[key] == undefined ? value : a[key]

## a = {'3': 2 }
于 2013-04-19T15:13:34.790 回答