从 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']

当我 运行 我的代码时,我总是得到一个空数组。请有人告诉我我的代码中的错误。谢谢

A​​rray是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']));

您的方向是正确的,但遗漏了一些细节。

  1. 正如其他人提到的,您不能只将离散数组与 === 进行比较。你能做的最好的就是元素明智的比较。如果比较 numbersstringsbools 等正常值类型,则实际上不需要这样做。如果你加入排序后的字符串,使用 ===.

    等内置运算符进行比较会容易得多
  2. 你的控制逻辑有问题。请注意您是如何直接从循环返回的?这意味着您最多只能得到一个结果,因为循环无法在整个循环条件下迭代。

  3. 您应该始终使用 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

替换整个 forarray.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']));