【问题标题】:Can anyone please explain me the following function from eloquent javascript谁能解释一下雄辩的javascript中的以下功能
【发布时间】:2020-06-08 05:28:35
【问题描述】:
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] 因此 findindex of "name " 是 0) 但实际上已知 = -1 。

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

非常感谢您提前考虑和考虑!!!

【问题讨论】:

  • 再次检查。您刚才说在第三次迭代中,name 的值是true(这是正确的)。然后稍后您声称known 应该为0,但实际情况是counts = [{name: false, count: 2}] 在那个点上不包含name: true 的元素,这是在counts.findIndex() 调用中搜索到的name 的值。

标签: javascript


【解决方案1】:

实际上在您的第三次迭代中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}
         ];

`

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在第三次迭代中,

      当项目为 3 时,

      groupName(3) 为真,

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

      现在 counts 元素的所有 name 属性的 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}]

      在第四次迭代中, 计数 = [{名称:“水果”,计数:2},{名称:“家具”,计数:1}] name = groupName("table") = "furniture" 所以 findIndex 返回 1。

      但在第二个阶段, 计数 = [{名称:“水果”,计数:1}] 名称 = groupName("椅子") = "家具" 不匹配,所以 findIndex 返回 - 1。 并且该函数创建 {name: "furniture", count :1} 并附加到计数。

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

      {姓名,计数:1}

      这是一个简写, 其实是 { name : name, count : 1 } 其中 name (key, "name") : name (value, groupName(item) 的结果。

      【讨论】:

        【解决方案4】:

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

        如何对它们进行分组由groupName 函数定义,该函数从数组中获取一个元素并决定组名是什么。在这种情况下,n => n > 2 是组函数,这意味着您有 2 个组名:'true' 和 'false',所有大于 2 的都为 'true',其他所有都为 'false'。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 2015-12-21
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多