有谁能解释一下雄辩的javascript中的以下函数吗
在第三次迭代中,当item为3时,我会认为name的值为true(这是正确的),而known的值为0。(因为counts=[name=false,count:2]所以“name”的findindex是0),但实际上known=-1 你能解释一下为什么known=-1(这意味着找不到元素,但根据我的想法,“name”在[name=false,count:2]处找到。)有谁能解释一下雄辩的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
非常感谢您事先的想法和考虑
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}
];