Javascript 有人知道这行代码是如何工作的吗?

Javascript 有人知道这行代码是如何工作的吗?,javascript,arrays,Javascript,Arrays,您好,最近在进行代码战培训时,我偶然发现了这个解决方案。需要解决的情况如下: 您可能从Facebook和其他页面了解“喜欢”系统。人们可以“喜欢”博客文章、图片或其他项目。我们希望创建应该显示在此类项目旁边的文本。 实现如下函数::[String]->String,它必须接受输入数组,包含喜欢某个项目的人的姓名。它必须返回显示文本,如示例所示: ////////////////////////////////////////////////////////////////////////////

您好,最近在进行代码战培训时,我偶然发现了这个解决方案。需要解决的情况如下: 您可能从Facebook和其他页面了解“喜欢”系统。人们可以“喜欢”博客文章、图片或其他项目。我们希望创建应该显示在此类项目旁边的文本。 实现如下函数::[String]->String,它必须接受输入数组,包含喜欢某个项目的人的姓名。它必须返回显示文本,如示例所示: ///////////////////////////////////////////////////////////////////////////////// likes[]//必须是“没人喜欢这个” 喜欢[“彼得”]//必须是“彼得喜欢这个” 喜欢[“雅各布”,“亚历克斯”]//必须是“雅各布和亚历克斯喜欢[“Max”,“John”,“Mark”]//必须是“Max,John和Mark喜欢这样” 喜欢[“Alex”、“Jacob”、“Mark”、“Max”]//必须是“Alex、Jacob和其他两个这样的人” ////////////////////////////////////////////////////////////////////////////////////////////

作为回报,我发现了这样编写的代码:

 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的数字量。在其他两个名字被使用后,n怎么能得到它的数字?如何“:”能够在那里使用,它不只是用于对象吗?它是如何工作的?return val==“{name}”的用途是什么?这行代码如何知道何时切换到{n}。我知道我一直在问一些很无聊的问题,我很抱歉我还在上高中,只是为了准备上大学。非常感谢您的支持,replace函数附带了一个回调函数,该回调函数将被调用,每次调用的匹配字数等于一个。 在您的示例3迭代中

三元运算符检查它是关于{name}还是关于{n}如果{name},它将返回数组中出现的第一个名称(移位函数),并用数组元素的其余部分替换数组。
在每次迭代中,它用
returnval==“{name}”返回的值替换模板{}?names.shift():names.length//
因此,当itreation完成时,它将返回最终输出。

因此,从您所说的判断,我假设您意识到,
idx
是经过计算来选择正确的模板的,所以我不会过多地详细讨论它。首先是它本身。它需要两个参数,一个是替换,另一个是字符串或函数。他使用的正则表达式是
/{name}{n}/g
,我将对其进行分解

  • /
    表示javascript中正则表达式的开始
  • {name}
    表示文本字符串
    {name}
  • |
    表示“或”
  • {n}
    表示文本字符串
    {n}
  • /
    表示正则表达式的结束
  • g
    是一个标志,这意味着正则表达式应该匹配所有出现的情况

基本上,正则表达式匹配所有出现的
{name}
{n}
。在本例中,替换是一个函数,它将匹配的子字符串作为参数并返回替换。函数体使用了一个用于简洁的函数,它基本上采用了
条件的形式?val_true:val_false
。如果
条件
为真,则该语句将为
val\u true
,否则将为
val\u false
。因此,如果值是
{name}
,那么我们使用以获取数组的第一个元素,同时将其从数组中删除,因此在数组的开头有一个新名称。否则,我们知道它必须是
{n}
,因为唯一匹配的值是
{name}
{n}
。在这种情况下,我们只需返回数组的长度即可获得剩余的人数,因为以前使用的姓名已被删除。

看看是什么。谢谢!你真的解释得很透彻,我终于明白了。还有一个问题,正则表达式就像一个循环?所以它有一个名字而不是另一个你能给我解释一下吗?抱歉,我对堆栈还是新手,所以我不知道在正则表达式对它找到的每个匹配项运行函数之前要点击哪些按钮,而且由于它匹配所有出现的
{name}
{n}
,它将对每个
{name}
{n}
运行函数。哇,这非常有用,谢谢你的回答