所以,在這個問題上有點掙扎。
我有一個看起來像這樣的物件:
const search = something.map((some) => {
const search = {
writer: some.writers, // (this is an array)
title: some.title.toLowerCase(),
reference: some.reference.toLowerCase(),
};
return search;
});
我正在嘗試對物件值內的所有文本進行搜索。該some.writer欄位是一個陣列,里面可以有許多作者。
我目前正在像這樣過濾:
const filtered = search.filter((entry) => Object.values(entry).some((val) => typeof val === 'string'
&& val.includes(searchTerm)));
該過濾器在物件內查找搜索詞并回傳包含該詞或該詞的一部分的所有字串。
問題是,它只查看頂層,并沒有進入writers陣列內部進行搜索。
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
search從something陣列構建陣列時,我還會使所有作者小寫(并且我會toLocaleLowerCase在“降低”操作中用于區域設定感知):
const search = something.map((some) => {
const entry = {
writer: some.writers.map(writer => writer.toLocaleLowerCase()),
title: some.title.toLocaleLowerCase(),
reference: some.reference.toLocaleLowerCase(),
};
return entry;
});
然后在過濾時,我會更直接地搜索,而不是構建一堆中間陣列:
// I'm assuming `val` has already been put through `toLocaleLowerCase`
const filtered = search.filter(({title, reference, writers}) => {
return title === val || reference === val || writers.includes(val);
});
但是,如果您想讓它動態化,因此在不修改搜索代碼的情況下向條目添加新屬性(除了在創建時search),那么正如評論中指出的那樣,您可以使用flat展平值陣列,以便writers展開進入陣列的頂層:
// I'm assuming `val` has already been put through `toLocaleLowerCase`
const filtered = search.filter(entry => Object.values(entry).flat().includes(val));
兩者都很容易調整以進行子字串搜索:
// I'm assuming `val` has already been put through `toLocaleLowerCase`
const filtered = search.filter(({title, reference, writers}) => {
return title.includes(val) || reference.includes(val) || writers.some(writer => writer.includes(val));
});
和
// I'm assuming `val` has already been put through `toLocaleLowerCase`
const filtered = search.filter(entry => Object.values(entry).flat().some(e => e.includes(val)));
您可能還想使用normalize搜索值并val以不同方式處理某些“字符”在 Unicode 中表示的差異。如果是這樣,基本上將.toLocaleLowerCase()以上所有更改為.normalize().toLocaleLowerCase().
uj5u.com熱心網友回復:
您可以使用Array.prototype.flat將類似的內容[1, [2, 3], 4]變成[1, 2, 3, 4]:
const filtered = search.filter((entry) => Object.values(entry).flat().some((val) => typeof val === 'string' && val.includes(searchTerm)));
// ^^^^^^^
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311118.html
標籤:javascript 数组 筛选
