我想检查数组中的字符串1是否包含字符串2中单词的字母。这是我的示例数组:
(["Floor", "far"]);
函数应返回false,因为“a”不在字符串“Floor”中 但对于像这样的数组:
(["Newbie", "web"]);
它应该返回true,因为“web”中的所有字母都在“Newbie”中。
到目前为止,这是我的代码......
function mutation(arr) {
var newArr = [];
for (i=0; i<arr.length; i++) {
newArr.push(arr[i].toLowerCase().split(""));
}
for (i=0; i<newArr.length; i++) {
for (j=0; j<newArr[i].length; j++) {
console.log(newArr[0][j]+ (newArr[1][j]));
}
}
}
mutation(["Newbie", "web"]);
我知道它不起作用,我不知道如何制作它。我尝试在两个数组中创建一组所有字母并进行比较。如果至少有一个 false ,则该函数应返回false。我应该在某处嵌套 indexOf()方法吗?
答案 0 :(得分:4)
我认为这对你有用。分解字符串以检查数组。迭代数组获取每个字母并检查传入的字符串是否包含字母,如果不存在则将结果设置为false。
function mutation(arr) {
var charArr = arr[1].toLowerCase().split("");
var result = true;
charArr.forEach(element => {
if (!arr[0].toLowerCase().includes(element)) {
result = false;
}
});
return result;
}
console.log(mutation(["Newbie", "web"]));
答案 1 :(得分:1)
很酷的方式是:
const mutation =([one, two]) => (set => [...two.toLowerCase()].every(char => set.has(char)))(new Set(one.toLowerCase()));
工作原理:
首先,我们将传递的数组解构为第一个和第二个词:
[one, two]
现在我们同时获得了两个,我们从第一个单词构建了一组字符:
(set => /*...*/)(new Set(one))
在IIFE中的所有原因我们需要这里的设置:
[...two].every(char => set.has(char))
将第二个单词扩展到数组中,因此我们得到一个字符数组,然后检查所有字符是否都是我们从另一个单词构建的集合的一部分。
答案 2 :(得分:1)
如果您想确保一个单词(可能包含多个重复字母)包含在另一个单词中,请使用Array.reduce()
计算字母数,然后存储创建一个map字母 - &gt;计数。这两个词都做到了。使用entries检查第一个字地图中是否包含第二个字的所有Array.every()
:
const countLetters = (w) =>
w.toLowerCase()
.split('')
.reduce((r, l) => r.set(l, (r.get(l) || 0) + 1), new Map());
const mutation = ([a, b]) => {
const al = countLetters(a);
const bl = countLetters(b);
return [...bl].every(([k, v]) => v <= (al.get(k) || 0));
};
console.log(mutation(["Floor", "far"])); // false
console.log(mutation(["Floor", "for"])); // true
console.log(mutation(["Floor", "foroo"])); // false
console.log(mutation(["Newbie", "web"])); // true
&#13;