我有一个充满对象的资源数组。每个对象都有类别数组,其中包含对象。我试图应用过滤器只返回具有特定名称的类别对象的资源。我在数据对象的嵌套方面遇到了一些麻烦。
以下是我正在使用的数据:
const resources = [
{
title: 'Learn JS',
categories: [
{
name: 'javascript'
},
{
name: 'css'
}
]
},
{
title: 'Learn CSS',
categories: [
{
name: 'css'
}
]
},
{
title: 'Learn other stuff',
categories: [
{
name: 'jQuery'
},
{
name: 'javascript'
}
]
},
{
title: 'Learn node',
categories: [
{
name: 'node'
}
]
},
{
title: 'Learn React',
categories: [
{
name: 'react'
}
]
},
];
这是我的两次尝试。两者都返回空数组。我错误地尝试使用maps
和filters
。是否需要for loop
?
//GOAL: Return only the resources that have a category with name 'javascript'
const attemptOne = resources.filter((item) => {
return item.categories.forEach((thing, index) => {
return thing[index] === 'javascript'
});
}).map((item) => {
return item;
})
const attemptTwo = resources.filter((item) => {
item.categories.filter((ci) => {
return ci.name === 'javascript'
}).map((nextItem) => {
return nextItem;
});
})
我已经磕磕绊绊了一会儿,我不确定我是不是只是把它复杂化了。提前谢谢!
答案 0 :(得分:3)
您可以尝试使用filter
和some
数组方法:
function getResourcesByCategoryName(Resources, CategoryName){
return Resources.filter(function(resource){
return resource
.categories
.some(function(category){ return category.name == CategoryName; });
});
}
答案 1 :(得分:2)
您可以filter
使用resources
。在过滤器内部,由于您已经知道某个对象具有类别,因此您应该遍历它并返回true(如果它是您要查找的类别名称)。
const resources = [{
title: 'Learn JS',
categories: [{
name: 'javascript'
}, {
name: 'css'
}]
}, {
title: 'Learn CSS',
categories: [{
name: 'css'
}]
}, {
title: 'Learn other stuff',
categories: [{
name: 'jQuery'
}, {
name: 'javascript'
}]
}, {
title: 'Learn node',
categories: [{
name: 'node'
}]
}, {
title: 'Learn React',
categories: [{
name: 'react'
}]
}];
function filterViaCategory(arr, category) {
return arr.filter((obj) => {
for (let i = 0, length = obj.categories.length; i < length; i++) {
if (obj.categories[i].name === category) {
return true;
}
}
return false;
});
}
console.log(filterViaCategory(resources, 'javascript'));
更新:
function filterViaCategory(arr, category) {
return arr.filter(obj => obj.categories.some(cat => cat.name === category));
}