function scramble(str1, str2) {
for (var i=0; i<str2.length; i++){
if (str1.split('').indexOf(str2[i])>=0){
str1.split('').splice(str1.split('').indexOf(str2[i]),1);
console.log(str1)
} else {return false};
} return true
}
scramble('rkqodlw','world')
我对拼接函数有疑问,运行此代码后,str1不会每次都更改,而且我真的不知道问题出在哪里。
答案 0 :(得分:1)
str1.split('')返回新的字符串数组,并且str1不变。
答案 1 :(得分:1)
因为您没有在splice()
上应用str1
。您正在splice()
上应用str1.split('')
。要解决此问题,请在函数开始时将str1
分配给数组,然后使用splice()
根据MDN
除
objects
以外的所有类型均定义了不可变值(无法更改的值)。例如,与C不同,字符串是不可变的。我们将这些类型的值称为原始值。
str1.split('')
不会更改str1
的值,而是return
一个应存储在变量中的新值。
function scramble(str1, str2) {
str1 = str1.split('');
for (var i=0; i<str2.length; i++){
if (str1.indexOf(str2[i])>=0){
str1.splice(str1.indexOf(str2[i]),1);
console.log(str1.join(''))
} else {return false};
} return true
}
scramble('rkqodlw','world')
更简便的方法:
您可以使用filter()
和includes()
function scramble(str1, str2) {
return str1.split('').filter(x => !str2.includes(x))
}
console.log(scramble('rkqodlw','world'))
答案 2 :(得分:0)
str1.split('')
返回一个新数组。在此数组上调用splice
会修改该数组,而不是str1
。
在数组上拼接会修改该数组:
let arr = [1, 2, 3];
arr.splice(2);
arr; // [1, 2]
但不是构造数组的字符串。
let str = '1 2 3';
let arr = str.split(' ');
arr.splice(2);
str; // ' 1 2 3'
arr; // ['1', '2']
答案 3 :(得分:0)
您将返回与str1
相同的结果,而不是带有after拼接值。因此,您需要在循环spl
之前定义split。
function scramble(str1, str2) {
var spl =str1.split('');
for (var i = 0; i < str2.length; i++) {
if (spl.indexOf(str2[i]) > -1) {
spl.splice(spl.indexOf(str2[i]), 1);
console.log(spl.join(''))
} else {
return false
};
}
return true
}
scramble('rkqodlw', 'world')
简化版
function scramble(str1, str2) {
str2.split('').forEach(a=> str1=str1.replace(a,''));
return str1;
}
console.log(scramble('rkqodlw', 'world'))