我有这段代码。它会增加数组中的值,或者如果未定义则将其设置为1:
if(typeof sum[period][count] === "undefined"){
sum[period][count] = 1
}else{
sum[period][count]++;
}
我想让它更短,更少重复:
node = sum[period][count];
if(typeof node === "undefined"){
node = 1
}else{
node++;
}
甚至
node = typeof node === "undefined"? 1 : node+1;
但它不起作用,为什么不起作用,我该怎么办呢?
答案 0 :(得分:2)
因为值sum[period][count]
是原语,所以无法获得对它的引用。您可以通过将包含此值的对象分配给变量var node = sum[period]
并测试node[count]
来缩短它。但是,它不会短得多:
var node = sum[period];
if(typeof node[count] === "undefined"){
node[count] = 1
}else{
node[count]++;
}
答案 1 :(得分:1)
因为node
的值不是参考。
答案 2 :(得分:0)
我相信你的解决方案在某些情况下会起作用,但在其他情况下它不会起作用。这是使用数组数组(二维数组/散列)并仅检查二阶值是否未定义的结果。
定义列表列表(例如“sum”)时,不会创建2D矩阵。相反,您正在创建一维列表的一维列表。如果找到第一个列表索引(句点),那么它将获得该列表并查找该第二个列表中的第二个索引(计数)。但是,如果第一个列表不包含第一个索引,那么由于您在未定义的列表中引用索引,因此您将立即收到错误。
解决方案是在检查第二个之前检查第一个订单索引值是否未定义。为了重用,我将代码打包在一个函数中。您将要删除JQuery输出;它刚刚添加到我的测试中。
var sum = {0: {0: 2}};
var period = 0;
var count = 1;
var helper = function(idxa, idxb) {
if (sum[idxa] === undefined) {
sum[idxa] = {idxb: 1}; // we can define the new list, knowing idxb must be 1 now.
} else {
// you were onto the right code here, but you weren't validating sum[idxa] separately.
sum[idxa][idxb] = (sum[idxa][idxb] === undefined) ? 1 : sum[idxa][idxb] + 1;
}
$('#output').append(" After: " + sum[idxa][idxb]);
};
helper(0, 3); // outputs " After: 1". [0] was defined, but [0][3] wasn't.
helper(2, 3); // outputs " After: 1". Neither [2] nor [2][3] were defined.
helper(0, 0); // outputs " After: 3", because [0][0] was 2
helper(0, 0); // outputs " After: 4", because we already incremented to 3.
你可以在三元内部嵌套三元运算,但我没有,因为它不会更快,也不会提高可读性。