过滤具有多个值的数组

时间:2017-07-15 18:32:47

标签: javascript arrays

我正在使用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,但我的示例的语法可能不准确。

6 个答案:

答案 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)

您可以修改函数以接受对象和搜索查询中的数组

&#13;
&#13;
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;
&#13;
&#13;

答案 4 :(得分:0)

&#13;
&#13;
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;
&#13;
&#13;

答案 5 :(得分:0)

你应该避免嵌套循环。我会改变数据结构,以适应更有效的搜索。{tax1:['work 1','work 2'], tax2:[],}