如何根据其中一个嵌套数组的值过滤数组?

时间:2017-04-26 10:33:46

标签: javascript arrays loops filter

假设我有一组符合以下模式的对象:

var posts = [
    {
        title: post_ab,
        category_array : [
            { id: 1, slug: category-a },
            { id: 2, slug: category-b }
        ]
    },
    {
        title: post_ac,
        category_array : [
            { id: 1, slug: category-a },
            { id: 3, slug: category-c }
        ]
    },
    {
        title: post_bc,
        category_array : [
            { id: 2, slug: category-b },
            { id: 3, slug: category-c }
        ]
    }
]

我试图过滤上面的数组,只返回category_array包含与指定值匹配的slug的值。

例如,如果我想过滤' category-c',则只返回第2和第3个值(post_ac和post_bc)。

我尝试使用嵌套过滤器,这让我无处可去:

var currentCategory = 'category-b';

var filteredPosts = function( posts ) {
    return posts.filter( function( post ){
        return post.category_array.filter( function( category ){
            return category.slug === currentCategory;
        })
    })
}

5 个答案:

答案 0 :(得分:5)

你必须在内循环中使用Array.prototype.some()

var filteredPosts = function(posts) {
    return posts.filter(function(post){
        return post["category_array"].some(function(category){
            return category.slug === currentCategory;
        });
    });
}

它会返回boolean结果,可以在.filter()回调中使用。

答案 1 :(得分:2)

让我们将somefilter

结合起来

var posts = [
        {
            title: 'post_ab',
            category_array : [
                { id: 1, slug: 'category-a' },
                { id: 2, slug: 'category-b' }
            ]
        },
        {
            title: 'post_ac',
            category_array : [
                { id: 1, slug: 'category-a' },
                { id: 3, slug: 'category-c' }
            ]
        },
        {
            title: 'post_bc',
            category_array : [
                { id: 2, slug: 'category-b' },
                { id: 3, slug: 'category-c' }
            ]
        }
    ];
    var result = posts.filter(a => a.category_array.some(cat => cat.slug.includes('a')));
    console.log(result);

答案 2 :(得分:0)

您可以使用Array.prototype.some

posts.filter(
  (elem) => (
    elem.category_array.some(
      elem => elem.slug === currentCategory;
    )
  )
)

答案 3 :(得分:0)

您可以设置Array.prototype.find()以获取数组slug'category-b'等于category_array的第一个元素,并返回该元素(如果存在)将被评估为真实,或者如果不存在,则Array.prototype.filter()

var posts = [{title: 'post_ab',category_array : [{ id: 1, slug: 'category-a' },{ id: 2, slug: 'category-b' }]},{title: 'post_ac',category_array : [{ id: 1, slug: 'category-a' },{ id: 3, slug: 'category-c' }]},{title: 'post_bc',category_array : [{ id: 2, slug: 'category-b' },{ id: 3, slug: 'category-c' }]}],
    currentCategory = 'category-b',
    result = posts.filter(function (p) {
      // Return only the very first element found
      return p.category_array.find(function (c) {
        return currentCategory === c.slug;
      });
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 4 :(得分:-2)

用一些()

替换你的内部过滤器