【发布时间】: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