【问题标题】:Filter inside a nested array with objects在带有对象的嵌套数组中过滤
【发布时间】:2020-09-19 23:22:35
【问题描述】:

我有一个包含三个书籍对象的数组。每个 book 对象都有一个 bookIds 数组。我想以一种快速有效的方式按 bookId (3,1) 进行过滤,因为我的数组将来会很容易增长。我尝试使用地图,但即使使用 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"
  }
]

谢谢,

【问题讨论】:

  • map 没有更改您的原始数组。
  • 是的!否则我将保留地图解决方案。查看我刚刚更新的帖子
  • 您传递了一个更改books 的函数作为map 的回调。 map 只是调用你回调并返回它的结果。
  • 试试const results = books.map(x => ({...x, books: x.books.filter(b => b.bookId === 1 || b.bookId === 3)}))
  • 我的结果与我的帖子中的非预期结果相同,但是这次我的原始数组没有改变,所以这是一个好的开始:)

标签: javascript filter


【解决方案1】:

我认为您正在寻找 filtersome -

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"
  }
]

【讨论】:

    【解决方案2】:

    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));

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 2020-03-11
      • 2022-01-13
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多