首页 > 解决方案 > 有谁知道这行代码是如何工作的?

问题描述

嗨,最近在进行代码大战训练时,我偶然发现了这个解决方案。需要解决的案例如下:你可能知道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}。我知道我一直在问非常菜鸟的问题,我很抱歉我还在读高中,只是为了为大学做准备。谢谢你的时间

标签: javascriptarrays

解决方案


所以从你所说的来看,我假设你意识到这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},那么我们使用.shiftorder 获取数组的第一个元素并同时将其从数组中删除,因此在数组的开头有一个新名称。否则,我们知道它必须是{n},因为匹配的唯一值是{name}{n}. 在这种情况下,我们只需返回数组的长度即可获得剩余人数,因为之前使用的名称已被删除。


推荐阅读