ES6中的.filter()方法可以返回一个不包含特定字符串的对象数组。

3

我能够根据是否包含等于“Featured”的标签成功返回一个数组。以下是代码:

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

  }

这会筛选每篇博客文章,然后我在文章内的标签数组中使用 .some()。
现在我需要创建一个函数,返回不包含“Featured”这个词的文章数组。
以下是目前的函数:
  renderRegular() {
    const regularPost = blogPosts.filter((item) => (
      item.tags.find((value) => value !== 'Featured' )
    ))

    console.log(regularPost)

  }

1
好的,那你有什么问题吗? - StudioTime
4个回答

2

仅仅否定测试并不是解决问题的方法。如果标签是Tag1,Featured,Tag2,你的测试将会成功因为"Tag1" != "Featured"

相反地,你需要否定some()的结果而不是其中的测试。

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

或者您可以应用德摩根定律。 "一些X == Y" 的相反是 "每个X!= Y":

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

我同意使用 "some" 的解决方案,但是我仍然对使用 "every" 方法感到疑惑。也许,我想得有些奇怪。 - Bhojendra Rauniyar
尝试在纸上执行它,你会发现它是正确的。如果数组的每个元素都不等于“Featured”,那么这意味着该数组不包含“Featured”。 - Barmar
然后就不会列出任何帖子了... 我的想法确切地是这样的。它应该列出除“Featured”标签之外的所有其他帖子。 - Bhojendra Rauniyar
1
这就是它的作用。 every()不是在对帖子数组进行操作,而是一次只对一个帖子的标签数组进行操作。如果标签数组不包含“Featured”,则every()返回true,因此filter会返回该帖子。 - Barmar
看看Danziger的答案中的代码片段,它们表明它是有效的。 - Barmar
@BhojendraRauniyar 将箭头函数替换为普通函数,你可能会更容易地看出发生了什么。 - Danziger

2
你需要使用 Array.prototype.every(),而不是 Array.prototype.find()。如果所有元素都满足条件,every() 将返回 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);


0

find 会返回第一个符合条件的元素,因为它会返回一个元素,即一个字符串,它总是会被评估为 true。使用 indexOf 来搜索字符串的存在。

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

    console.log(regularPost)
}

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'
    ))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接