js数组过滤问题

功能:点选标签,过滤数据。

1.动态变化标签数据:slectedId = ["1","2","3"]

2.模拟数据:

hotelList: [{
        "name": "豪华",
        "price": "2980",
        "hotelRoomDetails": [{
          "breakfast": "7折",
          "bed": "大床",
          "status": [{
              "tag": "1",
              "name": "含早"
            },
            {
              "tag": "2",
              "name": "8折"
            },
            {
              "tag": "3",
              "name": "9折"
            }
          ]
        }, {
          "breakfast": "无早",
          "bed": "早餐",
          "status": [{
              "tag": "1",
              "name": "含早"
            }
          ]
        }]
      },
      {
        "name": "精品房",
        "price": "3680",
        "hotelRoomDetails": [{
          "breakfast": "早餐",
          "bed": "大床",
          "status": [
            {
              "tag": "3",
              "name": "9折"
            }
          ]
        }, {
          "breakfast": "早餐",
          "bed": "大床",
          "status": [
            {
              "tag": "2",
              "name": "8折"
            }
          ]
        }, {
          "breakfast": "无早",
          "bed": "大床",
          "status": [{
              "tag": "1",
              "name": "含早"
            },
            {
              "tag": "2",
              "name": "8折"
            },
            {
              "tag": "3",
              "name": "9折"
            }
          ]
        }]
      },
      {
        "name": "总统套房",
        "price": "166660",
        "hotelRoomDetails": [{
          "breakfast": "订制早餐",
          "bed": "订制大床",
          "status": [{
              "tag": "1",
              "name": "含早"
            },
            {
              "tag": "2",
              "name": "8折"
            },
            {
              "tag": "3",
              "name": "9折"
            }
          ]
        }]
      }
]

3.zangeci朋友的方法:(status是一个字段)

this.data.hotelList.reduce((res, v) => {
    const hotelRoomDetails = v.hotelRoomDetails.filter(o => slectedPreId.includes(o.status))
    if(hotelRoomDetails.length) res.push({...v, hotelRoomDetails})
    return res;
}, [])
阅读 2.4k
3 个回答
this.data.hotelList.reduce((res, hotel) => {
  const hotelRoomDetails = hotel.hotelRoomDetails.filter(room => slectedPreId.every(id => room.status.find(state => state.tag === id)))
  hotelRoomDetails.length && res.push({ ...hotel, hotelRoomDetails })
  return res;
}, [])

let slectedId = ["1","2","3"]
let status = ['2','3','4']
let arr = []

slectedId.forEach(item=>{
  if(status.includes(item)){
    arr.push(item)
  }
})

console.log('交集',arr)

取交集的方法太多了

image.png

  1. 查询有早餐、有八折的房间。

    slectedId = ["1", "2", "3"];
     hotelList.filter(hotel =>
         hotel.hotelRoomDetails.every(detail =>
             detail.status.every(statu => slectedId.includes(statu.tag))//includes 类型要完全匹配
         )
     )
  2. 再有一个例子比如我想找个有早餐又免费的房间。
    image.png
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题