使用一个元素初始化数组,如果存在数组则使用push元素

时间:2017-01-31 07:24:29

标签: javascript arrays ecmascript-6

我们假设你有一个散列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];

6 个答案:

答案 0 :(得分:7)

您可以使用逻辑OR并在必要时创建数组。

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

答案 1 :(得分:3)

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

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

这只重复一次o[key]

请注意整个(o[key] = o[key] || [])作业的结果,其结果为o[key]

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

try {
    o[key].push(x)
}
catch(e) {
    //cannot push to undefined exception
    o[key] = [x]
}

答案 5 :(得分:0)

你不妨做以下事情;它们的性能差异很小。

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])