ES6 .filter()将返回没有特定字符串的对象数组

时间:2018-08-23 19:48:26

标签: javascript arrays ecmascript-6

我能够基于是否包含等于==='Featured'的标记成功返回数组。这是代码:

  getFeatured() {
    return blogPosts.filter((item) => (
      item.tags.some((value) => value === 'Featured')
    ))

  }

这会过滤每个博客帖子,然后在帖子中的标记数组上使用.some()。

我现在需要创建一个函数,该函数返回不包含“功能”一词的帖子数组。

这是到目前为止的功能:

  renderRegular() {
    const regularPost = blogPosts.filter((item) => (
      item.tags.find((value) => value !== 'Featured' )
    ))

    console.log(regularPost)

  }

4 个答案:

答案 0 :(得分:2)

您需要使用Array.prototype.every()代替Array.prototype.find(),如果所有元素都满足谓词,则返回true。在这种情况下,如果所有标签(每个标签)都不等于'Featured',或者换句话说,如果所有标签都不等于'Featured'(另请参见@Barmar的答案):

const posts = [{
  title: 'Post 1',
  tags: ['Featured'],
}, {
  title: 'Post 2',
  tags: ['Foo', 'Featured'],
}, {
  title: 'Post 3',
  tags: ['Bar'],
}];

const regularPost = posts.filter(item =>
  item.tags.every(value => value !== 'Featured'));

console.log(regularPost);

这样做的好处是,您还可以轻松检查除相等或不相等以外的条件:

const posts = [{
  title: 'Post 1',
  tags: ['Featured'],
}, {
  title: 'Post 2',
  tags: ['Foo', 'FEATURED POSTS'],
}, {
  title: 'Post 3',
  tags: ['Bar'],
}];

const regularPost = posts.filter(item =>
  item.tags.every(value => !value.match(/featured/gi)));

console.log(regularPost);

但是,如果您只进行相等比较,则Array.prototype.indexOf()Array.prototype.includes()可能是更好的选择:

const posts = [{
  title: 'Post 1',
  tags: ['Featured'],
}, {
  title: 'Post 2',
  tags: ['Foo', 'Featured'],
}, {
  title: 'Post 3',
  tags: ['Bar'],
}];
  
// const regularPost = posts.filter(item =>
//   item.tags.indexOf('Featured') === -1);

const regularPost = posts.filter(item =>
  !item.tags.includes('Featured'));

console.log(regularPost);

答案 1 :(得分:2)

简单地否定测试不是这样做的方法。如果标记为Tag1, Featured, Tag2,则测试将成功,因为"Tag1" != "Featured"

相反,您需要否定some()的结果,而不是对其内部的测试。

  renderRegular() {
    return blogPosts.filter((item) => (
      !item.tags.some((value) => value === 'Featured')
    ))
  }

或者您可以申请de Morgan's Laws。 “ some X == Y”的反义词是“每个X!= Y”:

  renderRegular() {
    return blogPosts.filter((item) => (
      item.tags.every((value) => value !== 'Featured')
    ))
  }

答案 2 :(得分:0)

find将返回与您的条件匹配的第一个元素,因为它将返回一个元素,即一个始终为true的字符串。使用indexOf搜索字符串是否存在。

renderRegular() {
    const regularPost = blogPosts.filter((item) => (
      item.tags.indexOf('Featured') === -1
    ))

    console.log(regularPost)
}

答案 3 :(得分:0)

您可以分配项目:

renderRegular() {
    const regularPost = blogPosts.filter((item) => 
      // assign item so the filter will return item matched condition with the find
      item = item.tags.find((value) => value !== 'Featured'
    ))
}