有谁能解释一下雄辩的javascript中的以下函数吗

有谁能解释一下雄辩的javascript中的以下函数吗,javascript,Javascript,在第三次迭代中,当item为3时,我会认为name的值为true(这是正确的),而known的值为0。(因为counts=[name=false,count:2]所以“name”的findindex是0),但实际上known=-1 你能解释一下为什么known=-1(这意味着找不到元素,但根据我的想法,“name”在[name=false,count:2]处找到。) 非常感谢您事先的想法和考虑 countBy获取一个元素数组并对它们进行分组,然后获取每组的计数 它如何对它们进行分组是由group

在第三次迭代中,当item为3时,我会认为name的值为true(这是正确的),而known的值为0。(因为counts=[name=false,count:2]所以“name”的findindex是0),但实际上known=-1

你能解释一下为什么known=-1(这意味着找不到元素,但根据我的想法,“name”在[name=false,count:2]处找到。)


非常感谢您事先的想法和考虑

countBy
获取一个元素数组并对它们进行分组,然后获取每组的计数

它如何对它们进行分组是由
groupName
函数定义的,该函数从数组中获取一个元素,并决定组名是什么。在本例中,
n=>n>2是组函数,这意味着您有两个组名:'true'和'false','true'表示所有>2的内容,而'false'表示所有其他内容

因此,您有两个组:true和false,这是由groupName函数定义的,输出是每个组中数组中所有项的计数。有两项小于或等于2,因此
{name:false,count:2}
,还有一项大于2,因此
{name:true,count:1}


例如,您可以尝试更改name函数,而不是
n=>n>2
您可以使用
n=>n%2?“奇数“:“偶数”
然后查看输出

函数的行为是正确的,因为在第三次迭代中,名称为True,并且属性名称中没有其他值为True的元素

counts.findIndex(c=>c.name==name); 这个函数很简单,比较{“name”:False,count:0}。name==True。第三次迭代的结果是-1

当项目为3时

groupName(3)为true

计数为[{name:false,计数:2}]

现在counts元素的all name属性的findIndex与groupName(3)不匹配,因此返回-1的索引

我重复一遍,findIndex的比较是c.name和name,而c.name是counts元素的属性,当时只有一个--false

我再举一个例子:

console.log(countBy([“苹果”、“椅子”、“香蕉”、“桌子”),item=>item==“苹果”、“香蕉”、“水果”:“家具”);
// → [{姓名:“水果”,计数:2},{姓名:“家具”,计数:2}]

在第四次迭代中, 计数=[{名称:“水果”,计数:2},{名称:“家具”,计数:1}] 名称=组名称(“表”)=“家具” 因此findIndex返回1

但在第二次致畸时, 计数=[{名称:“水果”,计数:1}] 名称=组名(“椅子”)=“家具” 没有匹配项,因此findIndex返回-1。 函数创建{name:“furniture”,count:1}并附加到counts

好吧,也许这就是你不明白的地方。你看,在创造阶段

{名称,计数:1}

这是一个速记, 实际上是

{
姓名:姓名,,
计数:1
}

其中name(key,“name”):name(值,groupName(item)的结果。

实际上在第三次迭代中
计数。findIndex(c=>c.name==name);
返回
-1
因为
findIndex
找不到任何满足函数
c=>c.name==name

第一次迭代 `

`

第二次迭代 `

`

第三次迭代 `


`

再次检查一下。您刚才说在第三次迭代中,
name
的值是
true
(这是正确的)。然后您声称
known
应该是0,但事实是
计数=[{name:false,count:2}]
在该点,它不包含具有
name:true
的元素,该元素是在
counts.findIndex()调用中搜索的
name
的值。
function countBy(items, groupName) {
   let counts = [];
   for (let item of items) {
      let name = groupName(item);
      let known = counts.findIndex(c => c.name == name);
      if (known == -1) {
         counts.push({
            name,
            count: 1
         });
      } else {
         counts[known].count++;
      }
   }
   return counts;
}

console.log(countBy([1, 2, 3], n => n > 2));
// → [{name: false, count: 2}, {name: true, count: 1}]
item = 1;
name = groupName(item); // name = false, since item => item > 2
known = counts.findIndex(c => c.name == name); // known = -1
counts = [{name: false, count: 1}]
item = 2;
name = groupName(item); // name = false, since item => item > 2
known = counts.findIndex(c => c.name == name); // known = 0
counts = [{name: false, count: 2}]
item = 3;
name = groupName(item); // name = true, since item => item > 2
known = counts.findIndex(c => c.name == name); // known = -1
counts = [
           {name: false, count: 2},
           {name: true, count: 1}
         ];