我正在尝试基于另一个对象数组过滤一些对象。所以我从API获取数据。例如收据:
[
{
"id": 1,
"name": "test",
"category": {
"id": 1,
"name": "Cookies",
},
},
{
"id": 2,
"name": "test2",
"category": {
"id": 2,
"name": "Candy",
},
}
]
然后,我尝试根据另一个类别数组过滤类别名称上的对象。我为此创建了一个函数:
function onSelectCategory(category) {
let receiptsList = receipts.filter((a) =>
a.category.includes(category.name)
);
setReceiptsView(receiptsList);
setSelectedCategory(category);
}
const category = [ { "id": 2, "name": "Candy" } ];
onSelectCategory(category);
当我运行这个函数时,我得到一个空的Array[]
。我真的不明白我做错了什么。
由于param似乎是一个对象数组,因此需要使用Array#some
进行比较:
const receipts = [
{ "id": 1, "name": "test", "category": { "id": 1, "name": "Cookies" } },
{ "id": 2, "name": "test2", "category": { "id": 2, "name": "Candy" } }
];
const categories = [ { "id": 2, "name": "Candy" } ];
const receiptsList = receipts.filter(({ category }) =>
categories.some(({ name }) => name === category.name)
);
console.log(receiptsList);
另一种使用Set
:的解决方案
const receipts = [
{ "id": 1, "name": "test", "category": { "id": 1, "name": "Cookies" } },
{ "id": 2, "name": "test2", "category": { "id": 2, "name": "Candy" } }
];
const categories = [ { "id": 2, "name": "Candy" } ];
const categorySet = new Set(categories.map(({ name }) => name));
const receiptsList = receipts.filter(({ category }) =>
categorySet.has(category.name)
);
console.log(receiptsList);
假设category
(参数(是一个字符串,问题是您正试图从字符串中获取属性name
,而您应该将字符串与对象进行比较。
试试这个:
a.category.name == category;
而不是
a.category.includes(category.name)
假设类别是字符串,我可能错了,请告诉我们参数category
等于什么来澄清。