![](/img/trans.png)
[英]can please someone explain the working of bind function for this example from eloquent
[英]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.