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