我有一个类似字符串的数组,就像地标列表一样:
[“AB Street”,“A B Street”,“AB Street XE”,“AB Street X”,“AB 街(XE)“]
其中每一个都代表着一个标志性的“AB街”。
我尝试了不同的方法,找到了一种方法来删除多余的空格和特殊字符,但却无法弄清楚如何使用扩展名来缩短无关条目,无论如何都会导致相同的字符串。
用于删除空格和特殊字符的代码段:
var landmarks = ["AB Street", "A B Street", "AB Street XE", "AB Street X", "AB Street(XE)"];
var formattedLandmarks = [];
landmarks.sort();
landmarks.forEach(function(location) {
var key = location && location.toLowerCase();
key = key.replace(/[.\/-]*/g, "");
key = key.replace(/\(.*\)/i, "");
key = key.replace(/[0-9, _-]*$/, "");
key = key.replace(/[ \t]+/g, " ");
key = key.toString().trim();
key = key.charAt(0).toUpperCase() + key.slice(1);
formattedLandmarks.push(key);
});
console.log(formattedLandmarks);
我希望算法将输出作为数组返回,只有一个条目:
[“AB Street”]
如果有人可以通过RegExp或其他方式帮助获得最佳的方法和算法来实现预期的输出,那将是非常好的。
任何帮助都是值得的。
答案 0 :(得分:1)
您可以尝试这样的事情:
注意:您正在比较已分析的值,因此您应该仅根据这些已解析的值进行排序。
var array = ["AB Street", "A B Street", "AB Street XE", "AB Street X", "AB Street(XE)"];
var regex = /[^a-z]/gi;
var final = [];
array.sort(function(item1, item2){
var _a = item1.replace(regex,"");
var _b = item2.replace(regex,"");
return _a > _b? 1: _a < _b ? -1: 0;
}).reduce(function(currentItem, nextItem) {
var _p = currentItem.replace(regex, "");
var _c = nextItem.replace(regex, "");
if (_c.indexOf(_p)<0 || !currentItem) {
final.push(nextItem);
}
return nextItem;
}, "")
console.log(final)