我正在使用下面的代码来识别字符是否重复,如果被重复,则替换为特定的字符,否则为另一个字符。
此代码有效
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的工作方式?
答案 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个参数(您在此处调用index
,nonsense
和s
)。在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
函数最多包含三个参数,其中第二个和第三个是可选的。您的变量index
,nonsense
和s
将填充当前值, actual 索引和数组。删除nonsense
,您的s
变量将成为map
的当前索引,而不是数组。
这是预期的行为。