Mutations对一个包含两个元素的数组,检测数组中的第二个元素的所有字母是否都在第一个元素中出现过,如果出现过,返回的是true
,否则返回的是false
。(其中忽略大小写)
简单分解一下:
- 将目标字符串(数组中的第一个元素
arr[0]
)和测试字符串(数组中的第二个元素arr[1]
)转换为小写字符串(通过toLowerCase()
) - 将数组中的两个元素分别转换为数组(通过
split()
) - 使用
for
循环将测试字符串每个字符传入到目标字符串中搜索(通过indexOf()
) - 如果搜索传回值为负数,也就是
indexOf()
传来的值为-1
,则返回false
,也就是说测试字符串在目标字符串中没有匹配的字符串 - 若全部字符串匹配(
indexOf()
的值大于或等于0
),返回true
在这里主要运用到有关于JavaScript的知识:
这样就可以开始来写函数了。
function mutation (arr) {
var baseStr = arr[0].toLowerCase().split('');
var testStr = arr[1].toLowerCase().split('');
/*
* arr = ["Hello","hey"]
* arr[0].toLowerCase().split('') => ["H", "e", "l", "l", "o"]
* arr[1].toLowerCase().split('') => ["h", "e", "y"]
* len = arr[1].length = 3
*/
for (var i = 0, len = testStr.length; i < len; i++){
var temp = baseStr.indexOf(testStr[i]);
/*
* 遍历次数 i=? i<len testStr[i] baseStr.indexOf(testStr[i])
* 1st 0 yes "h" 0
* 2en 1 yes "e" 1
* 3rd 2 yes "y" -1
* 4th 3 no
* end loop
*/
if (temp === -1) {
return false;
}
}
return true;
}
做个测试,看看是否符合:
mutation(["hello","hey"]); // false
mutation(["hello","he"]); // true
mutation(["abcdefghjiklmnopkrstuvwxyz","my name is damo"]); //false
mutation(["abcdefghjiklmnopkrstuvwxyz","mynameisdamo"]); //true
不用多说,看结果就知道,是我们需要的,也符合文章开头所说的需求。
上面的for
循环,还可以换成for ... in
方法。
function mutation (arr) {
var baseStr = arr[0].toLowerCase().split(''),
testStr = arr[1].toLowerCase().split('');
for (var i in testStr) {
var temp = baseStr.indexOf(testStr[s]);
if (temp === -1) {
return false;
}
}
return true;
}
除了使用for
循环之外,还可以使用Array.prototype.every()
:
function mutation (arr) {
var baseStr = arr[0].toLowerCase().split(''),
testStr = arr[1].toLowerCase().split('');
return testStr.every(function (letter) {
return baseStr.indexOf(letter) != -1;
});
}
在JavaScript中有一个charAt()
方法,可以返回字符串中指定位置的字符。
var str = "hello";
for (var i = 0, len = str.length; i < len; i++) {
console.log("字符串在index等于" + i + ": '" + str.charAt(i) + "'");
}
输出的结果
字符串在index等于0: 'h'字符串在index等于1: 'e'字符串在index等于2: 'l'字符串在index等于3: 'l'字符串在index等于4: 'o'
这样一来,在最开始的方法上稍做调整:
function mutation (arr) {
var baseStr = arr[0].toLowerCase(),
testStr = arr[1].toLowerCase();
for (var i in testStr) {
var temp = baseStr.indexOf(testStr.charAt(i));
if (temp === -1) {
return false;
}
}
return true;
}
上面通过不同的方式方法实现文章开头所述的需求。这也是JavaScript算法练习之一,如果大家感兴趣也可以看看下面的视频。
如果您有更好的方案,欢迎在下面的评论中与我们一起分享。
如需转载,烦请注明出处:http://www.w3cplus.com/javascript/mutations-in-javascript.html