【问题标题】:Initialize array with one element, or push element if array exists用一个元素初始化数组,如果数组存在则推入元素
【发布时间】:2017-06-16 13:14:39
【问题描述】:

假设你有一个数组的散列o;例如为事件注册的回调,当每个事件可以有 0 个或多个回调时。

在 ES6 中有没有更好的表达方式?

if (key in o) o[key].push(x); else o[key] = [x]

“更好”是指其他开发人员更容易理解。可能更简洁,但不以牺牲可读性为代价。一个特殊(常见)问题是 o 通常是一个较长的表达式,例如this.listeners,重复三遍似乎不是最理想的。所以真正的代码可能是这样的:

if (event in this.listeners)
    this.listeners[event].push(callback);
else
    this.listeners[event] = [callback];

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

    通过使用logical nullish assignment ??=,您可以检查属性,如果是undefinednull,则创建一个新数组。

    (o[key] ??= []).push(x);
    

    旧方法:

    如有必要,您可以使用逻辑 OR 并创建一个数组。

    o[key] = o[key] || [];
    o[key].push(x);
    

    【讨论】:

      【解决方案2】:

      使用当前处于第 4 阶段的 proposal logical assignment,您可以这样做:

      (o[key] ||= []).push(x);
      

      它是supported by major browsers。 typescript也支持(至少4.1及以上)

      【讨论】:

        【解决方案3】:

        一种解决方案是对空数组使用逻辑 OR 并推送到结果数组:

        (o[key] = o[key] || []).push(x);
        

        这只会重复一次o[key]

        注意整个(o[key] = o[key] || []) 分配周围的括号,其结果是o[key]

        o[key] = (o[key] || []).push(x) 不正确,因为 push 返回数组的新长度。

        【讨论】:

        • 虽然这样有效,但由于括号内的赋值,它很容易被误读。
        • @NinaScholz:在 JS 中有点尴尬(主要是因为没有 ||=“默认赋值运算符”),但如果你熟悉这个成语,那就还不错。许多成语在开始时有点不透明,但随着经验变得非常清晰(例如无处不在的!!“布尔运算符”)。
        • @Amadan,更多的是行内赋值运算符的问题。
        【解决方案4】:

        与其他答案几乎相同(除了它创建一个新数组),但您可以使用数组初始值设定项语法:

        o[key] = [...o[key] || [], x];
        

        【讨论】:

          【解决方案5】:

          你不妨这样做;它们的性能差异很小。

          o[key] = o[key] ? o[key].concat(x) : [x]
          o[key] ? o[key].push(x) : o[key] = [x]
          o[key] && o[key].push(x) || (o[key] = [x])
          

          【讨论】:

          • 虽然这些都是正确的,但我希望尽可能少地重复o[key](这似乎是 2 次)。
          【解决方案6】:
          try {
              o[key].push(x)
          }
          catch(e) {
              //cannot push to undefined exception
              o[key] = [x]
          }
          

          【讨论】:

          • 天哪,只有在有好的理由时才应该使用异常。这里没有人……
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-28
          • 1970-01-01
          • 2019-02-09
          • 2013-10-19
          • 1970-01-01
          相关资源
          最近更新 更多