[英]Map and Filter mapped array in Javascript
這是一個非常簡單的問題。 我想在給定另一個數組的情況下映射並形成一個數組。 然后我想刪除重復的值。
這就是我所做的:
let status = listHotels.map(hotel => {
return hotel.status
})
const x = status.filter((v, i) => (
status.indexOf(v) === i
));
有用。 但我想要一個不涉及編寫兩個代碼塊的解決方案。 我試過這個:
let status = listHotels.map(hotel => {
return hotel.status
}).filter((v, i) => (
status.indexOf(v) === i
));
但它沒有用。 它說
無法讀取未定義的屬性“indexOf”
有誰知道解決方法嗎?
當您調用.filter
方法時,狀態仍未定義。
將您的代碼更改為:
const listHotels = [{status:'s1'}, {status:'s1'}, {status:'s2'}] let status = listHotels.map(hotel => { return hotel.status }).filter((v, i, currentStatus) => ( currentStatus.indexOf(v) === i )); console.log(status);
您可以使用findIndex
執行此操作,傳遞一個函數來比較狀態,並交換過濾器/地圖:
const listHotels = [{status: 'bad'}, {status: 'good'}, {status: 'bad'}]; let status = listHotels.filter((v, i) => listHotels.findIndex(v2 => v.status === v2.status) === i ).map(hotel => hotel.status); console.log(status);
status尚未准備好( undefined
)以訪問filter()
內部。 但在第一個解決方案中, map()返回結果並將結果存儲在狀態中,這使得該變量在后面的語句中可用。
您可以將數組本身作為第三個參數傳遞給filter()
使用。 你也不需要在這里使用不必要的return語句:
var listHotels = [{status:'a'}, {status:'b'}, {status:'a'}] let status = listHotels.map(hotel => hotel.status).filter((v, i, arr) => arr.indexOf(v) === i); console.log(status);
由於您使用的是let
和const
我假設您也可以使用 ES6 Set
:
const data = [{ status: 'one', id: 1 }, { status: 'one', id: 2 }, { status: 'two', id: 3 }, { status: 'two', id: 4 }] const uniqueStatus = [...new Set(data.map(({ status }) => status))] console.log(uniqueStatus)
將映射數組傳遞給Set
將確保唯一性。 您可以將 Set 解構為數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.