我正在使用JavaScript Array Filter按关键字过滤一些对象数组。最初,我有一个对象数组:
let works = [
{ title: ' work 1', medium: 'tax1' },
{ title: ' work 2', medium: 'tax2' },
{ title: ' work 3', medium: 'tax3' },
{ title: ' work 4', medium: 'tax2' },
{ title: ' work 5', medium: 'tax1' }
]
并且可以通过'medium'以这种方式过滤数组:
mediumFilter(taxonomy) {
return works.filter(item => {
return (
item.medium.indexOf(taxonomy) > -1
);
});
},
当我将分类法变量传递给 mediumFilter()时,在本例中为“tax1”左右 - 我得到一个包含该特定项目的数组介质。
这是最初的 - 现在我的项目变得越来越复杂,我发现自己在苦苦挣扎。我的新数组包含一个嵌套数组,它是要在过滤中匹配的值。
let works = [
{ title: ' work 1', medium: [ 'tax1', 'tax3' ] },
{ title: ' work 2', medium: [ 'tax1' ] },
{ title: ' work 3', medium: [ 'tax3' ] },
{ title: ' work 4', medium: [ 'tax2', 'tax1' ] },
{ title: ' work 5', medium: [ 'tax1' ] }
]
注意媒体是一个包含多个字符串的数组。
我正在寻求一些如何解决这个问题的帮助。我需要我的函数来返回与传递的变量匹配的项目。由于某些作品可能有多种媒介,我需要能够按多个值进行过滤。如果媒体数组有多个值,则只需要匹配一个。
谢谢!
顺便说一下,使用与问题无关的vue,但我的示例的语法可能不准确。
答案 0 :(得分:2)
您可以使用Array#includes
并检查字符串。
let works = [{ title: 'work 1', medium: ['tax1', 'tax3'] }, { title: 'work 2', medium: ['tax1'] }, { title: 'work 3', medium: ['tax3'] }, { title: 'work 4', medium: ['tax2', 'tax1'] }, { title: 'work 5', medium: ['tax1'] }],
mediumFilter = taxonomy => works.filter(item => item.medium.includes(taxonomy));
console.log(mediumFilter('tax3'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
mediumFilter(taxonomy) {
return works.forEach(item => {
for(let i = 0; i < item.medium.length; i++){
if(item.medium[i].indexOf(taxonomy) > -1){
return true;
}
}
return false;
});
},
我相信这就是你的想法。如果分类法是一个数组(并且总是如此,那么你可以做mediumFilter('tax1')
和mediumFilter(['tax1','tax2'])
,那么你也可以这样做:
mediumFilter(taxonomy) {
return works.forEach(item => {
for(let i = 0; i < item.medium.length; i++){
for(elem of taxonomy){
if(item.medium[i].indexOf(elem) > -1){
return true;
}
}
}
return false;
});
},
答案 2 :(得分:0)
如果我的问题正确,那么这应该有效:
function mediumFilter(taxonomy) {
return works.filter(x => x.medium.indexOf(taxonomy) > -1 );
}
答案 3 :(得分:0)
您可以修改函数以接受对象和搜索查询中的数组
function mediumFilter(taxonomy) {
taxonomy = Array.isArray(taxonomy) ? taxonomy : [taxonomy];
return works.filter(item => {
let medium = Array.isArray(item.medium) ? item.medium : [item.medium];
return taxonomy.some(med => medium.includes(med));
});
}
let works = [
{title: ' work 1', medium: ['tax1', 'tax2']},
{title: ' work 2', medium: 'tax2'},
{title: ' work 3', medium: 'tax3'},
{title: ' work 4', medium: 'tax4'},
{title: ' work 5', medium: 'tax5'}
];
function log(x) {console.log( x.map( y => y.title) )}
log( mediumFilter('tax1') ); // 1
log( mediumFilter(['tax1', 'tax2']) ); // 1, 2
log( mediumFilter('tax2') ); // 1, 2
log( mediumFilter(['tax4']) ); // 4
&#13;
答案 4 :(得分:0)
let works = [
{ title: ' work 1', medium: [ 'tax1', 'tax3' ] },
{ title: ' work 2', medium: [ 'tax1' ] },
{ title: ' work 3', medium: [ 'tax3' ] },
{ title: ' work 4', medium: [ 'tax2', 'tax1' ] },
{ title: ' work 5', medium: [ 'tax1' ] }
]
function mediumFilter(taxonomy) {
return works.filter(item => {
return item.medium.filter(subitem => {
return (
subitem.indexOf(taxonomy) > -1
);
});
});
}
console.log(mediumFilter('tax1'));
&#13;
答案 5 :(得分:0)
你应该避免嵌套循环。我会改变数据结构,以适应更有效的搜索。{tax1:['work 1','work 2'], tax2:[],}