簡體   English   中英

Javascript 中的映射和過濾映射數組

[英]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);

由於您使用的是letconst我假設您也可以使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM