从 list-codewars 问题中查找单词的 Anagrams
Finding the Anagrams of a word from a list- codewars question
我是编程的新手,我正在解决一个关于代码战争的问题,如下所示:
问题:
编写一个函数,从列表中找到一个单词的所有字谜。您将获得两个输入,一个单词和一个包含单词的数组。您应该 return 一个包含所有字谜的数组,如果有 none,则应该是一个空数组。
这是我的代码
function anagrams(word, words) {
let word_Array = word.split('').sort()
let total = []
for (x = 0; x<words.length; x++) {
if(words[x].split('').sort() === word_Array) {
total.push(words[x])
} return total
}
}
结果应该是这样的
anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']
当我 运行 我的代码时,我总是得到一个空数组。请有人告诉我我的代码中的错误。谢谢
Array是JavaScript中的Object,是引用类型。
所以你不能使用“===”来检查两个数组是否相等。
例如:
var array1=[1,2];
var array2=[1,2];
var result = array1 === array2;
结果为假。
我的建议是编写一个新函数,通过比较项来检查两个数组是否相等。
function areEquals(array1, array2){
if(array1.length!==array2.length){
return false;
}
for(var i in array1){
if(array1[i]!==array2[i]){
return false;
}
}
return true;
}
请看下面的片段。
const sort = (word) => word.split('').sort().join('');
function anagrams(word, words) {
let token = sort(word);
let total = []
for (let x = 0; x < words.length; x++) {
if (sort(words[x]) === token) {
total.push(words[x])
}
}
return total
}
console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));
您的方向是正确的,但遗漏了一些细节。
正如其他人提到的,您不能只将离散数组与 ===
进行比较。你能做的最好的就是元素明智的比较。如果比较 numbers
、strings
、bools
等正常值类型,则实际上不需要这样做。如果你加入排序后的字符串,使用 ===
.
等内置运算符进行比较会容易得多
你的控制逻辑有问题。请注意您是如何直接从循环返回的?这意味着您最多只能得到一个结果,因为循环无法在整个循环条件下迭代。
您应该始终使用 let/const
限定您的变量声明。这在 for 循环中缺失,并且会声明 x
为全局变量。
改进
您可以用 for of 替换 for
循环,而不必担心索引。
for (let w of words) {
console.log(w); // we no longer have to worry about words[i].
}
更好的是,你可以用一个简单的 array.filter
替换整个 for
和 array.push
逻辑
const sort = (word) => word.split('').sort().join('');
function anagrams(word, words) {
let token = sort(word);
return words.filter((w) => sort(w) === token);
}
console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));
我是编程的新手,我正在解决一个关于代码战争的问题,如下所示:
问题: 编写一个函数,从列表中找到一个单词的所有字谜。您将获得两个输入,一个单词和一个包含单词的数组。您应该 return 一个包含所有字谜的数组,如果有 none,则应该是一个空数组。 这是我的代码
function anagrams(word, words) {
let word_Array = word.split('').sort()
let total = []
for (x = 0; x<words.length; x++) {
if(words[x].split('').sort() === word_Array) {
total.push(words[x])
} return total
}
}
结果应该是这样的
anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']
当我 运行 我的代码时,我总是得到一个空数组。请有人告诉我我的代码中的错误。谢谢
Array是JavaScript中的Object,是引用类型。 所以你不能使用“===”来检查两个数组是否相等。
例如:
var array1=[1,2];
var array2=[1,2];
var result = array1 === array2;
结果为假。
我的建议是编写一个新函数,通过比较项来检查两个数组是否相等。
function areEquals(array1, array2){
if(array1.length!==array2.length){
return false;
}
for(var i in array1){
if(array1[i]!==array2[i]){
return false;
}
}
return true;
}
请看下面的片段。
const sort = (word) => word.split('').sort().join('');
function anagrams(word, words) {
let token = sort(word);
let total = []
for (let x = 0; x < words.length; x++) {
if (sort(words[x]) === token) {
total.push(words[x])
}
}
return total
}
console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));
您的方向是正确的,但遗漏了一些细节。
正如其他人提到的,您不能只将离散数组与
等内置运算符进行比较会容易得多===
进行比较。你能做的最好的就是元素明智的比较。如果比较numbers
、strings
、bools
等正常值类型,则实际上不需要这样做。如果你加入排序后的字符串,使用===
.你的控制逻辑有问题。请注意您是如何直接从循环返回的?这意味着您最多只能得到一个结果,因为循环无法在整个循环条件下迭代。
您应该始终使用
let/const
限定您的变量声明。这在 for 循环中缺失,并且会声明x
为全局变量。
改进
您可以用 for of 替换 for
循环,而不必担心索引。
for (let w of words) {
console.log(w); // we no longer have to worry about words[i].
}
更好的是,你可以用一个简单的 array.filter
替换整个for
和 array.push
逻辑
const sort = (word) => word.split('').sort().join('');
function anagrams(word, words) {
let token = sort(word);
return words.filter((w) => sort(w) === token);
}
console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));