繁体   English   中英

任何人都可以从 eloquent javascript 中向我解释以下函数

[英]Can anyone please explain me the following function from eloquent javascript

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 为 3 时,我会认为 name 的值为 true(这是正确的)并且 known 为 0。(因为 counts = [name = false, count: 2] 因此“name”的 findindex 为 0 ) 但实际上已知 = -1 。

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

非常感谢您提前的想法和考虑!!!

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

第一次迭代`

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}
         ];

`

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

counts.findIndex(c => c.name == name); 这个函数那些很简单,比较{"name": False, count:0}.name == True。 所以结果是-1

在第三次迭代中,

当项目为 3 时,

groupName(3) 为真,

计数是 [{name: false, count:2}],

现在计数元素的所有名称属性的 findIndex 与 groupName(3) 不匹配,因此返回 -1 的索引。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

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

让我为你再举一个例子:

console.log(countBy(["apple", "chair", "banana", "table"], item => item == "apple" || "banana"? "fruits" : "furniture")); // → [{name: "fruits", count: 2}, {name: "furniture", count: 2}]

在第四次迭代时,counts = [{name: "fruits", count: 2}, {name: "furniture", count: 1}] name = groupName("table") = "furniture" 所以 findIndex 返回 1。

但是在第二次迭代中, counts = [{name: "fruits", count: 1}] name = groupName("chair") = "furniture" 没有匹配,所以 findIndex 返回 - 1. 并且函数创建 {name: "家具”,计数:1} 并附加到计数。

好吧,也许这是你不明白的地方。 在创建时,您会看到

{名称,计数:1}

这是一个简写,它实际上是{ name : name, count : 1 }其中 name (key, "name") : name (value, result of groupName(item)。

countBy获取一组元素并将它们分组,然后获取每个组的计数。

如何将它们分组由groupName函数定义,该函数从数组中获取一个元素并决定组名是什么。 在这种情况下, n => n > 2是组函数,这意味着您有 2 个组名:'true' 和 'false','true' 表示所有 > 2,以及 'false' 表示其他所有内容。

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

您可以尝试更改名称函数,例如,您可以使用n => n % 2 ? 'odd' : 'even'代替n => n > 2 n => n % 2 ? 'odd' : 'even' n => n % 2 ? 'odd' : 'even'然后查看输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM