(新手问题)
我想弄清楚为什么下面的代码可以工作。
目标是从数组元素和.count(ID在范围中出现的次数)创建键。
我是这样接近它的。
var darray = [["BM","BM","CC","DD","CC","HH","KK","CC"]];
var obj = {}
for(i=0;i<darray.length;i++){
var codes= darray[i][0]
if(obj[codes]){
obj[codes].count +=1
}
else {
obj[codes] = {count: 1}
}
}
console.log(obj)
result example:
{
BM: {count:2},
CC: {count:3}
}
这返回了预期的输出,但我的观点是,如果我错过了else语句,那么我会得到一个空对象,我不明白为什么else语句中的初始化解决了这个问题。谢谢你,
我需要理解对象初始化的底层逻辑
4条答案
按热度按时间z9smfwbn1#
您的代码片段将只执行一次for循环,因为它是在外部
darray
数组长度(即1)上执行的。所以它只看darray[0][0]
。您需要使用内部数组(即
darray
的第一个元素)来循环键。代码片段中的第二个错误是在获取
codes
时需要交换数组查询。如果你不交换查询,那么你会得到一个索引越界错误,因为它会
可选地,我建议使用Map,因为对象是固定的形状,而Map可以改变形状,因为你正在使用。
q43xntqr2#
您在这里发布的代码没有按预期工作。我做了一些改变,使它工作。
我想你的问题是这样的:
如果我们遵循逻辑,它会检查obj[code]是否存在,如果不存在,他会在对象中创建这个条目。但是如果你从来没有把这个条目添加到对象中,它将永远不能对任何值进行计数。
但是它与对象初始化没有太大关系,因为这实际上发生在'var obj = {}'的第二个规则中。
wvt8vs2t3#
处理这种情况的最简单方法是创建一个函数,该函数接受一个数组并将每个元素减少某个值。
只需要将数组的第一项沿着一个可选的访问器一起传递给函数。如果未提供,则值为项本身。
avwztpqn4#
您尝试访问:
obj[codes].count
。这不会存在于你刚刚创建的空对象上,它只会在你设置了count对象时存在,而count对象只会出现在你的else语句中:obj[codes] = {count:1} /你告诉对象有一个使用数字类型的对象变量'count'
因此,count是您在else语句中手动设置对象变量,如果您将其删除,则
obj[codes].count +=1
将始终失败,因为.count不存在,直到您说它存在