我在 Angular 中有以下代碼。我希望能夠通過鍵入“america north”來找到“north america”。我怎么做?
const getContinents = keys =>
[
'africa',
'antarctica',
'asia',
'australia',
'europe',
'north america',
'south america'
].filter(e => e.indexOf(keys.toLowerCase()) > -1);
const fakeContinentsRequest = keys =>
of(getContinents(keys)).pipe(
tap(_ => console.log(`API CALL at ${new Date()}`))
);
fromEvent(document.getElementById('type-ahead'), 'keyup')
.pipe(
debounceTime(200),
map((e: any) => e.target.value),
distinctUntilChanged(),
switchMap(fakeContinentsRequest),
tap(c => (document.getElementById('output').innerText = c.join('\n')))
)
.subscribe();
uj5u.com熱心網友回復:
您可以split()在空格上使用字串來獲取每個單詞的陣列。
然后我們可以every()用來檢查是否input存在于search. 這樣,“順序”并不重要。
將其與find()在陣列中搜索匹配結果相結合:
const options = [ 'africa', 'antarctica', 'asia', 'australia', 'europe', 'north america', 'south america' ];
function findByWord(input) {
let inputSplit = input.split(' ');
return options.filter(o => o.split(' ').every(e => inputSplit.includes(e)));
}
const res = findByWord('america north');
console.log(res)
[
"north america"
]
uj5u.com熱心網友回復:
最簡單的解決方案就是顛倒您給出的那些詞,并假設所有大小寫都是正確的:
const matchStr = "I Love PHP";
const searchStr = "PHP Love";
if (matchStr.includes(searchStr.split(" ").reverse().join(" "))) {
console.log("Value matched: " matchStr);
}
要在您當前的代碼中實作,有點煩人,但您可以在您的filter行中添加一個 OR 條件:
.filter(e => (e.indexOf(keys.toLowerCase()) > -1) || (e.indexOf(keys.toLowerCase().split(" ").reverse().join(" ")) > -1));
uj5u.com熱心網友回復:
我做了一些更動態的東西,我在其中拆分搜索字串,然后在Array.filter(). 使用正則運算式可能更容易實作這一點。我還添加了一個要求,即搜索應忽略短于兩個單詞的單詞,并將關鍵字映射為小寫,以便它們不區分大小寫。
const continents = [
'africa',
'antarctica',
'asia',
'australia',
'europe',
'north america',
'south america'
]
const filterContinents = (searchStr, continents) => {
const MIN_KEYWORD_LENGTH = 2;
let keywordsArr = searchStr.split(' ')
.filter((keyword) => keyword.length > MIN_KEYWORD_LENGTH)
.map((keyword) => keyword.toLowerCase());
let hasKeywords = keywordsArr.length > 0;
const filterByKeywords = (_contintent) => {
for (const _keyword of keywordsArr) {
if (!_contintent.includes(_keyword)) {
return false
}
}
return hasKeywords
}
return continents.filter(filterByKeywords);
}
let searchStr = 'eur';
console.log({searchStr}, filterContinents(searchStr, continents));
searchStr = 'eu ro pe';
console.log({searchStr}, filterContinents(searchStr, continents));
searchStr = 'America North';
console.log({searchStr}, filterContinents(searchStr, continents));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467545.html
標籤:javascript 有角度的 rxjs
