【问题标题】:Find unique words from an array of anagrams using Map in Javascript在 Javascript 中使用 Map 从一组字谜中查找唯一单词
【发布时间】: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

【问题讨论】:

    标签: javascript arrays object anagram


    【解决方案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 的解决方案。但是您的解决方案有效,并且您很好地解释了它。它至少值得一票。谢谢!
    猜你喜欢
    • 2021-08-27
    • 2013-09-20
    • 1970-01-01
    • 2021-02-16
    • 2011-09-19
    • 1970-01-01
    • 2011-02-07
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多