我試圖通過回圈遍歷它的值將它與另一個陣列進行比較來過濾一個物件陣列。問題是過濾器函式默認在第一個 false 處停止,所以如果回圈回傳 (false, true, false) 它不會通過過濾器。
有沒有解決的辦法?
代碼(我在示例代碼中放置了簡化的陣列和物件):
const jobs = [
{id: 1,
location: 'AA'},
{id: 2,
location: 'BB'},
{id: 3,
location: 'CC'},
]
const filteredLocations = ['AA', 'CC']
const filteredJobs = jobs.filter(function(el, i) {
do {
return el.location === filteredLocations[i];
}
while (filteredLocations.length >= i)
})
// this only returns the first object instead of the desired first and third
謝謝!
uj5u.com熱心網友回復:
按預期使用該.filter函式,任何回傳都將添加到回傳的陣列中。
const jobs = [
{id: 1,
location: 'AA'},
{id: 2,
location: 'BB'},
{id: 3,
location: 'CC'},
]
const filteredLocations = ['AA', 'CC']
const filteredJobs = jobs.filter(el => {
return filteredLocations.includes(el.location);
});
旁注,您的代碼有兩個問題:
- 如果它與第一次出現不匹配,它可能會在 while 回圈內回傳 false,因此為什么你有單個輸出
- 您與陣列回圈
filteredLocations.length的i(index)進行比較,并且是 2 個不同的陣列,所以這樣做沒有意義jobsjobsfilteredLocations
uj5u.com熱心網友回復:
過濾器最初不會停止為假。它可以正常作業,但它不能回傳第一個和第三個物件,因為第三個物件位于索引 2 上,并且該索引上沒有任何專案filteredLocations。
uj5u.com熱心網友回復:
我建議你用一個簡單的 finder 函式替換do-while回圈,如下所示:
const jobs = [
{id: 1,
location: 'AA'},
{id: 2,
location: 'BB'},
{id: 3,
location: 'CC'},
]
const filteredLocations = ['AA', 'CC']
const filteredJobs = jobs.filter(function(el, i) {
return filteredLocations.find((filteredLocation) => filteredLocation === el.location);
})
console.log(filteredJobs);
uj5u.com熱心網友回復:
let filtered = jobs.map(j => filteredLocations.every(fl => fl == j.location));
uj5u.com熱心網友回復:
如何使過濾功能一開始就不會停止 false ?
filter()一開始永遠不要停止虛假。它將檢查所有通過應用條件的真實值,并將這些元素從陣列中回傳到新陣列中。
為了達到這個要求,您可以簡單地在過濾器函式中使用單行代碼而不是do-while回圈。
演示:
const jobs = [
{id: 1,
location: 'AA'},
{id: 2,
location: 'BB'},
{id: 3,
location: 'CC'},
];
const filteredLocations = ['AA', 'CC'];
const filteredJobs = jobs.filter(({ location }) => filteredLocations.includes(location));
console.log(filteredJobs);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/489788.html
標籤:javascript 数组
