javascript - 有谁知道这行代码是如何工作的?
问题描述
嗨,最近在进行代码大战训练时,我偶然发现了这个解决方案。需要解决的案例如下:你可能知道Facebook和其他页面的“点赞”系统。人们可以“喜欢”博客文章、图片或其他项目。我们想要创建应该显示在此类项目旁边的文本。实现一个函数 like :: [String] -> String,它必须接受输入数组,包含喜欢某个项目的人的姓名。它必须返回示例中所示的显示文本://////////////////////////////// //////////////////////////////////// 喜欢 [] // 必须是"noone like this" likes ["Peter"] // 必须是 "Peter likes this" likes ["Jacob", "Alex"] // 必须是 "Jacob and Alex like this" likes ["Max", "
作为回报,我发现了这样写的代码:
var names=["Erica", "Steven","Dono", "Erick"];
function likes (names) {
var templates = [
'no one likes this',
'{name} likes this',
'{name} and {name} like this',
'{name}, {name} and {name} like this',
'{name}, {name} and {n} others like this'
];
var idx = Math.min(names.length, 4);
return templates[idx].replace(/{name}|{n}/g, function (val) {//
return val === "{name}" ? names.shift() : names.length;//
});
}
var runlikes= likes(names);
console.log(runlikes);
对于解决方案,我找到了一个很好的解决方案,如图所示。我确实得到了代码,直到它到达 .replace 函数。我不明白代码是如何获得 Erica、Steven 和 Dono 的名字以及用来替换 n 的数字的数量。在使用其他两个名字之后,n 怎么能得到它的数字?“:”如何在那里使用,它不仅用于对象吗?它是如何工作的?return val === "{name} " 有什么用,这行代码怎么知道什么时候切换到 {n}。我知道我一直在问非常菜鸟的问题,我很抱歉我还在读高中,只是为了为大学做准备。谢谢你的时间
解决方案
所以从你所说的来看,我假设你意识到这idx
是为了选择正确的模板而计算出来的,所以我不会太详细地讨论这个问题。首先是.replace
它自己。它需要两个参数,一个要替换的正则表达式,以及一个字符串或函数的替换。他使用的正则表达式是/{name}|{n}/g
,我将对其进行分解。
/
表示 javascript 中正则表达式的开始。{name}
表示文字字符串{name}
。|
意思是“或”。{n}
表示文字字符串{n}
。/
表示正则表达式的结束。g
是一个标志,这意味着正则表达式应该匹配所有出现。
本质上,正则表达式匹配所有出现的{name}
or {n}
。在这种情况下,替换是一个函数,它将匹配的子字符串作为参数并返回替换。函数体使用三元运算符进行简洁,基本上采用condition ? val_true : val_false
. 如果condition
为真,则陈述为val_true
,否则为val_false
。因此,如果值为{name}
,那么我们使用.shift
order 获取数组的第一个元素并同时将其从数组中删除,因此在数组的开头有一个新名称。否则,我们知道它必须是{n}
,因为匹配的唯一值是{name}
和{n}
. 在这种情况下,我们只需返回数组的长度即可获得剩余人数,因为之前使用的名称已被删除。
推荐阅读
- swift - 如果为零,则替代三进制以生成空字符串?
- android - 在屏幕之间导航:React Native,无法确定 com.google.android.material:material:1.1.0 的工件:由于早期错误而跳过
- sql - 如何删除在postgresql中按日期列排序的每个分组结果中的第一行
- vue.js - 使用 Jest 测试 vue-echarts 组件时出错
- android - 创建可以移动并将其集成到 Android 应用程序中的 3D 化身模型
- java - 持久化数千个实体的最有效方法是什么?
- ios - NSPredicate:搜索相关值的数组,NOT
- node.js - 混合不同的存储目标
- html - 文本下的中心图片
- mysql - 使用 ALT 和 ADD 添加新列后如何向现有行添加值