javascript JS在循环中计数对象

kx5bkwkv  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(129)

(新手问题)
我想弄清楚为什么下面的代码可以工作。
目标是从数组元素和.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语句中的初始化解决了这个问题。谢谢你,
我需要理解对象初始化的底层逻辑

z9smfwbn

z9smfwbn1#

您的代码片段将只执行一次for循环,因为它是在外部darray数组长度(即1)上执行的。所以它只看darray[0][0]
您需要使用内部数组(即darray的第一个元素)来循环键。
代码片段中的第二个错误是在获取codes时需要交换数组查询。
如果你不交换查询,那么你会得到一个索引越界错误,因为它会

1. darray[0][0]
1. darray[1][0] // out of bounds
var darray = [["BM","BM","CC","DD","CC","HH","KK","CC"]];
var obj = {}

for(i=0;i<darray[0].length;i++){
 
    var codes= darray[0][i]
 
    if(obj[codes]){

       obj[codes].count +=1
    }
    else {
      obj[codes] = {count: 1}

    }
}

console.log(obj)

可选地,我建议使用Map,因为对象是固定的形状,而Map可以改变形状,因为你正在使用。

q43xntqr

q43xntqr2#

您在这里发布的代码没有按预期工作。我做了一些改变,使它工作。

var darray = ["BM", "BM", "CC", "DD", "CC", "HH", "KK", "CC"];
var obj = {}

for (i = 0; i < darray.length; i++) {

    var code = darray[i]

    if (obj[code]) {
        obj[code].count += 1
    } else {
        obj[code] = {
            count: 1
        }
    }
}

console.log(obj)

我想你的问题是这样的:

  • 为什么没有其他人它就不起作用?*

如果我们遵循逻辑,它会检查obj[code]是否存在,如果不存在,他会在对象中创建这个条目。但是如果你从来没有把这个条目添加到对象中,它将永远不能对任何值进行计数。

但是它与对象初始化没有太大关系,因为这实际上发生在'var obj = {}'的第二个规则中。

wvt8vs2t

wvt8vs2t3#

处理这种情况的最简单方法是创建一个函数,该函数接受一个数组并将每个元素减少某个值。
只需要将数组的第一项沿着一个可选的访问器一起传递给函数。如果未提供,则值为项本身。

const computeFrequency = (arr, accessor) =>
  Object.fromEntries([...arr.reduce((map, item) => {
    const value = accessor
      ? typeof accessor === 'function'
        ? accessor(item)
        : accessor[item]
      : item;
    const existing = map.get(value) ?? { count: 0 };
    existing.count++;
    return map.set(value, existing);
  }, new Map).entries()]);

const darray = [["BM", "BM", "CC", "DD", "CC", "HH", "KK", "CC"]];
const frequencies = computeFrequency(darray[0]);

console.log(frequencies)
.as-console-wrapper { top: 0; max-height: 100% !important; }
avwztpqn

avwztpqn4#

您尝试访问:obj[codes].count。这不会存在于你刚刚创建的空对象上,它只会在你设置了count对象时存在,而count对象只会出现在你的else语句中:
obj[codes] = {count:1} /你告诉对象有一个使用数字类型的对象变量'count'
因此,count是您在else语句中手动设置对象变量,如果您将其删除,则obj[codes].count +=1将始终失败,因为.count不存在,直到您说它存在

相关问题