Javascript:地图功能怪异行为

时间:2019-10-29 17:13:42

标签: javascript

我正在使用下面的代码来识别字符是否重复,如果被重复,则替换为特定的字符,否则为另一个字符。

此代码有效

function dup(str) {
  return str
    .toLowerCase()
    .split("")
    .map((index, nonsense, s) => {
      console.log(s);
      return s.indexOf(index) == s.lastIndexOf(index) ? "(" : ")";
    })
    .join("");
}

但是我不明白为什么,变量'nosense'使它起作用。如果您删除未使用的var,则会收到错误消息。

未使用的var如何影响map的工作方式?

4 个答案:

答案 0 :(得分:1)

问题在于参数的顺序和特定位置的值

function dup(str) {
  return str
    .toLowerCase()
    .split("")
    .map((char, index, self) => { // the order is char, index and the current array in the 3rd argument
      console.log(self);
      return self.indexOf(char) == s.lastIndexOf(char) ? "(" : ")";
    })
    .join("");
}

如果您希望使用未使用的变量(例如,用eslint表示)来消除问题,请使用_或带有_的前缀

function dup(str) {
  return str
    .toLowerCase()
    .split("")
    .map((char, _, self) => { // the order is char, index and the current array in the 3rd argument
      console.log(self);
      return self.indexOf(char) == self.lastIndexOf(char) ? "(" : ")";
    })
    .join("");
}

编辑

尽管不相关,但更理想的方法是使用Set进行重复数据删除。

function dup(str) {
  return Array.from(new Set(str
    .toLowerCase()
    .split(""))
    .join("");
}

答案 1 :(得分:1)

这与.map()无关,而与接收参数有关。

传递给.map的函数会自动传递3个参数(您在此处调用indexnonsenses)。在JavaScript中,不需要使用参数名称专门捕获其中的任何一个,但是如果要使用第二个或第三个参数,则需要为要跳过的参数提供一些参数名称。表明您对第三个参数感兴趣。

话虽如此,传递给.map()的参数(依次)是: 元素 索引 < / strong>, 数组 ,并且您的名字暗示您相信它是: 索引 元素 数组 。因此,更好的命名约定如下所示:

function dup(str) {
  return str
    .toLowerCase()
    .split("")
    .map((char, index, ary) => {
      console.log(ary);
      return ary.indexOf(index) == ary.lastIndexOf(index) ? "(" : ")";
    })
    .join("");
}

dup("The quick quick brown fox.");

答案 2 :(得分:1)

代码中的

索引表示当前char,废话表示s数组中该char的indexOf。如果删除废话,则index将代表char,而s将代表indexOf该char。导致错误的原因是您尝试在s为数字类型时尝试执行s.indexOf(index)

尝试这样做

 function dup(str) {
  return str
    .toLowerCase()
    .split('')
    .map(s => {
      console.log(s)
      return str.indexOf(s) == str.lastIndexOf(s) ? '(' : ')'
    })
    .join('')
}

答案 3 :(得分:1)

从文档中

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
    // Return element for new_array
}[, thisArg])

如您所见,map函数最多包含三个参数,其中第二个和第三个是可选的。您的变量indexnonsenses将填充当前值, actual 索引和数组。删除nonsense,您的s变量将成为map的当前索引,而不是数组。

这是预期的行为。