我正在尋找一種在陣列中搜索名稱的方法,包括可能顛倒搜索輸入(多個單詞:名字、姓氏)的情況。
陣列看起來像這樣,帶有一系列名稱。
const names = ['Alan Hope', 'Greg Day', 'Alan Peters']
搜索輸入可能如下 'peter Al'
實作這一目標的代碼是什么樣的。這是我到目前為止所擁有的,我知道這是完全錯誤的。
const studentNames = ['Alan Hope', 'Greg Day', 'Alan Peters']
function search () {
const bankingSheet = ss.getSheetByName('Banking')
const searchInput = 'Hope Al'
const searchWords = searchInput.split(/\s /)
const filtered = studentNames.filter(function(name) {
searchWords.every(function(word) {
return name.toString().toLowerCase().indexOf(word) !== -1
})
})
Logger.log(filtered)
}
根據我收集的資訊,我需要首先將搜索輸入拆分為組成詞。然后我需要過濾名稱陣列。對于陣列中的每個名稱,我需要檢查所有搜索詞是否以某種方式出現在名稱中。我認為這可能涉及到每個方法。
對于每個名稱,如果回傳值為真,那就是我需要回傳的。
這種想法正確嗎?

先感謝您!這一刻真的讓我頭疼!
uj5u.com熱心網友回復:
這個想法是定義匹配的含義。最簡單和最嚴格的匹配是簡單的字串相等。較軟的匹配將容忍大小寫差異。更柔和的仍然是對名字/姓氏倒置的容忍。(顯示在片段中)。
最軟的匹配是容忍名稱中的小差異(重新排序不會通過 levenshtein 檢查注冊為小差異),除非我們比較各個標記之間的距離)。
const names = ['Alan Hope', 'Greg Day', 'Alan Peters']
function softMatch(nameA, nameB) {
if (nameA === nameB) return true;
const reverse = name => name.split(' ').reverse().join(' ')
const lcA = nameA.toLowerCase();
const lcB = nameB.toLowerCase();
if (lcA === lcB) return true; // case insensitive
if (reverse(lcA) === lcB) return true; // order and case insensitive
return false
}
let matches = names.filter(name => softMatch(name, 'peters Alan'))
console.log(matches)
matches = names.filter(name => softMatch(name, 'No Match'))
console.log(matches)
如果名稱要具有兩個以上的子名稱,并且任何排序都是匹配的,則可以按如下方式實作匹配...
const names = ['Alan Randolph Hope', 'Greg Herbert Walker Day', 'Alan Jefferson Peters']
function softMatch(nameA, nameB) {
let subnamesA = nameA.split(' ').map(n => n.toLowerCase())
let subnamesB = nameB.split(' ').map(n => n.toLowerCase())
// sort lexically and compare
subnamesA = subnamesA.sort();
subnamesB = subnamesB.sort();
return subnamesA.every(function(element, index) {
return element === subnamesB[index];
});
}
let matches = names.filter(name => softMatch(name, 'peters Alan jefferson'))
console.log(matches)
matches = names.filter(name => softMatch(name, 'No Match'))
console.log(matches)
uj5u.com熱心網友回復:
替代解決方案:
您也可以嘗試下面的示例實作來查找匹配的名稱,即使搜索輸入被顛倒或姓氏/名字被縮寫(例如 Alan H. 或 Al Hope),以獲得更靈活的搜索方法:
const studentNames = ['Alan Randolph Hope', 'Greg Herbert Walker Day', 'Alan Jefferson Peters']
function findMatch(){
var match = run("Hope Al");
console.log(match);
console.log(match.length>0);
}
function run(searchString) {
var res = [];
let findDuplicates = arr => arr.filter((item, index) => arr.indexOf(item) != index);
var searches = searchString.split(" ");
searches.forEach(search=>{
studentNames.forEach(name =>{
if(name.toLowerCase().includes(search.toLowerCase())){
res.push(name);
}
});
});
return [...new Set(findDuplicates(res))];
}
示例演示:
- 搜索詞是
Hope Al:
- 搜索詞是
Greg D:
參考:
- 腳本的某些部分源自有關檢查 JavaScript 陣列中的重復字串的答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/374801.html
標籤:javascript 数组 谷歌应用程序脚本
上一篇:Python 人臉表情識別
下一篇:將多個非空行復制到新作業表


