为了账号安全,请及时绑定邮箱和手机立即绑定

在带有对象的嵌套数组中过滤

在带有对象的嵌套数组中过滤

喵喔喔 2023-03-18 17:32:15
我有一个包含三个书籍对象的数组。每个书籍对象都有一个 bookIds 数组。我想以快速有效的方式按 bookId (3,1) 进行过滤,因为我的数组将来会很容易增长。我尝试使用 map,但即使使用 deepCopy 也会更改我的原始数组!有没有办法在不使用递归的情况下使用过滤器函数?this.booksList =     [      {        "books": [          {            "bookId": 3          },          {            "bookId": 2          }        ],        "id": 1,        "name": "Name 1",        "description": "desc 1"      },      {        "books": [          {            "bookId": 5          },          {            "bookId": 2          }         ],         "id": 2,         "name": "Name 2",         "description": "desc 2"      },      {        "books": [          {            "bookId": 1          },          {            "bookId": 3          }         ],         "id": 3,         "name": "Name 3",         "description": "desc 3"      }    ]地图方法:let results = this.books.map(function (book) {            book.books = book.books.filter(x => x.bookId == 1 || x.bookId == 3);            return book;        }).filter(({ books }) => books.length);地图结果:不是预期的结果![  {    "books": [      {        "bookId": 3      }    ],    "id": 1,    "name": "Name 1",    "description": "desc 1"  },  {    "books": [      {        "bookId": 1      },      {        "bookId": 3      }     ],     "id": 3,     "name": "Name 3",     "description": "desc 3"  }]预期成绩 :[  {    "books": [      {        "bookId": 3      },      {        "bookId": 2      }    ],    "id": 1,    "name": "Name 1",    "description": "desc 1"  },  {    "books": [      {        "bookId": 1      },      {        "bookId": 3      }     ],     "id": 3,     "name": "Name 3",     "description": "desc 3"  }]谢谢,
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

我想你正在寻找filter并且some-


const input =

  [{books:[{bookId:3},{bookId:2}],id:1,name:"Name 1",description:"desc 1"},{books:[{bookId:5},{bookId:2}],id:2,name:"Name 2",description:"desc 2"},{books:[{bookId:1},{bookId:3}],id:3,name:"Name 3",description:"desc 3"}]


const query =

  [3, 1]


const result =

  input.filter(({ books = [] }) =>

    books.some(({ bookId = null }) => query.includes(bookId))

  )


console.log(JSON.stringify(result, null, 2))

输出 -


[

  {

    "books": [

      {

        "bookId": 3

      },

      {

        "bookId": 2

      }

    ],

    "id": 1,

    "name": "Name 1",

    "description": "desc 1"

  },

  {

    "books": [

      {

        "bookId": 1

      },

      {

        "bookId": 3

      }

    ],

    "id": 3,

    "name": "Name 3",

    "description": "desc 3"

  }

]


查看完整回答
反对 回复 2023-03-18
?
呼如林

TA贡献1798条经验 获得超3个赞

const booksList=[

  {books:[{bookId:3},{bookId:2}],id:1,name:"Name 1",description:"desc 1"},

  {books:[{bookId:5},{bookId:2}],id:2,name:"Name 2",description:"desc 2"},

  {books:[{bookId:1},{bookId:3}],id:3,name:"Name 3",description:"desc 3"},

];


const byBookIDs = (...IDs) =>

  booksList.filter(b => b.books.some(b => IDs.includes(b.bookId)));


console.log(byBookIDs(1, 3));

  • MDN 数组过滤器- 返回一个子集

  • MDN Array Some - 尽快匹配(并返回)一些

  • MDN Array Includes - 在数组中查找项目


查看完整回答
反对 回复 2023-03-18
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号