在 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,ear
或 PAN,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
非常适合这种情况。您可以按照以下步骤进行操作。
- 首先创建一个对字符串进行排序的辅助函数。
- 然后使用
Set
和 map()
创建一个唯一的排序字符串数组
- 然后
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));
没有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,ear
或 PAN,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
非常适合这种情况。您可以按照以下步骤进行操作。
- 首先创建一个对字符串进行排序的辅助函数。
- 然后使用
Set
和map()
创建一个唯一的排序字符串数组
- 然后
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));