在 Javascript 中使用 Map 从一组字谜中查找独特的单词

Find unique words from an array of anagrams using Map in Javascript

没有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

您可以使用 Set 标准化(小写,排序)字符串和 return 过滤结果。

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));

我认为 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));

您可以使用 .forEach() 遍历您的数组,并在每次迭代时检查您的 Map 是否具有已排序单词的键,如果没有,则设置排序后的词作为键,与词关联的词作为值。然后,您可以 return 地图的 .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));