在 Javascript 中使用 Map 从一组字谜中查找唯一单词

Posted

技术标签:

【中文标题】在 Javascript 中使用 Map 从一组字谜中查找唯一单词【英文标题】:Find unique words from an array of anagrams using Map in Javascript 【发布时间】:2020-01-16 10:20:56 【问题描述】:

我知道没有Map 怎么办。将Map 用于此任务似乎更合乎逻辑,但我似乎无法实现它。这甚至可能吗?

到目前为止,我把这个绑起来了:

function aclean(arr) 
  let result = [];
  let unique = new Map();

  for(let i = 0; i < arr.length; i++)
    let sorted = arr[i].toLowerCase().split("").sort().join("");

    /*if (unique.add(sorted)) 
      result.push(arr[i]);
    */
  

  return result;


let array = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log(aclean(array));

结果应该是:nap,teachers,earPAN,cheaters,era

【问题讨论】:

【参考方案1】:

您可以使用.forEach() 循环遍历您的数组,并在每次迭代时检查您的Map 是否有已排序单词的键,如果没有,则将已排序单词设置为键,并将与该单词关联的单词作为值。然后,您可以返回地图的 .values() 数组以获取结果:

function aclean(arr) 
  let unique = new Map();

  arr.forEach(word => 
    let sorted = word.toLowerCase().split("").sort().join("");
    if(!unique.has(sorted)) 
      unique.set(sorted, word);
        
  );

  return [...unique.values()];


let array = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];
console.log(aclean(array));

【讨论】:

如果您不关心订单,那么只需Map(a.map(w =&gt; [sorted, w]))【参考方案2】:

您可以将Set 与规范化(小写,已排序)字符串一起使用并返回过滤结果。

function aclean(array) 
    let unique = new Set();

    return array.filter(s => 
        let sorted = s.toLowerCase().split("").sort().join("");
        if (!unique.has(sorted)) 
            unique.add(sorted);
            return true;
        
    );


let array = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log(aclean(array));

【讨论】:

在这种情况下,我需要一个完全使用 Map 的解决方案,但是您的回答也很棒! Vielen Dank!【参考方案3】:

我认为Set 非常适合这种情况。您可以按照以下步骤进行操作。

首先创建一个对字符串进行排序的辅助函数。 然后使用Setmap() 创建一个唯一的排序字符串数组 然后map() 将该数组再次转换为原始数组中的值,该值是已排序字符串的变位词。

const sort = str => str.toLowerCase().split('').sort().join('')
const aclean = arr => [... new Set(arr.map(sort))].map(x => arr.find(a => sort(a) === x)) 

let array = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log(aclean(array));

【讨论】:

我需要一个完全符合 Map 的解决方案。但是您的解决方案有效,并且您很好地解释了它。它至少值得一票。谢谢!

以上是关于在 Javascript 中使用 Map 从一组字谜中查找唯一单词的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是使用 jQuery/Javascript 从一组复选框中选中了至少一个复选框?

javascript 从一组数据中找到指定的单条数据的方法 by FungLeo

使用UISegmentedControl从一组或一组值中选择

如何使用 LINQ 从一组数字中查找 n 项的所有组合?

从一组十六进制颜色中获取基色

如何从一组中继容器中组合片段?