我可以创建一个引用对象中节点的变量吗?

时间:2015-09-22 15:12:28

标签: javascript

我有这段代码。它会增加数组中的值,或者如果未定义则将其设置为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;

但它不起作用,为什么不起作用,我该怎么办呢?

3 个答案:

答案 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.

你可以在三元内部嵌套三元运算,但我没有,因为它不会更快,也不会提高可读性。