javascript - 如何使用数组包含并根据对象的属性检查对象

标签 javascript arrays filter javascript-objects

我有一个数组classTopics,其中的对象如下所示:

{
  questions:2,
  id:49,
  topic:{
    edited: null
    id: 1
    name: "Topic name"
    status: "ACTIVE"
    topicCode:"02"
  }
}

我还有一个数组 allTopics,其中对象与上面示例中的 topic 属性相同:

 {
    edited: null
    id: 1
    name: "Topic name"
    status: "ACTIVE"
    topicCode:"02"
  }

在选择字段中,我想过滤与 classTopics 数组对象中的属性主题 相同的所有主题。 所以,像这样:

 <AutoCompleteSelect
   options={allTopics.filter(topic => !classTopics.includes(topic)).map(({name}) => ({value: name, label: name}))}
 />

但是,这不起作用,因为它正在检查整个对象。我怎样才能做类似的事情,我可以根据对象的属性检查它?

基本上我想要以更好的方式实现这一目标:

const filteredTopics = allTopics
                        .filter(topic => 
                          (classTopics.findIndex(classTopic => classTopic.topic.id === topic.id)) === -1);

您可以找到工作示例 here .

最佳答案

按整个对象(每个属性)进行比较

您可以使用 some 来检查主题是否在 classTopics 数组内,并使用 everyObject.entries 来检查每个主题属性在主题数组中是相同的:

const classTopics = [{ questions: 2, id: 49, topic: { edited: null, id: 1, name: "Topic name", status: "ACTIVE", topicCode: "02" }}]
const allTopics = [{ edited: null, id: 1, name: "Topic name", status: "ACTIVE", topicCode: "02" }]

const filterTopics = (a, c) => {
  return a.filter(topic => c
    .some(c => Object.entries(c.topic)
      .every(([k,v]) => topic[k] === v)
    )
  )
}

console.log(filterTopics(allTopics, classTopics))

按 ID 比较

正如评论中所建议的,检查整个对象是多余的,ID 的目的是唯一地标识一个对象 - 使用 ID 可以提供更有效的解决方案:

const classTopics = [{ questions: 2, id: 49, topic: { edited: null, id: 1, name: "Topic name", status: "ACTIVE", topicCode: "02" }}]
const allTopics = [{ edited: null, id: 1, name: "Topic name", status: "ACTIVE", topicCode: "02" }]

const filterTopics = (a, c) => a.filter(topic => c.some(t => t.topic.id === topic.id))

console.log(filterTopics(allTopics, classTopics))

关于javascript - 如何使用数组包含并根据对象的属性检查对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57005394/

相关文章:

javascript - 参数 'sql' 的预期类型为 utf8,但得到的类型为 'object'

javascript - 即使使用 Vue.set ,更新数组也不会在 Vue 中重新渲染

php - 验证用户输入或����������

filter - Logstash Grok筛选器Apache访问日志

javascript - 在另一个变量的标题中使用来自一个变量的数据 - javascript

javascript - 绝对导入在 React Vite js 中不起作用

javascript - 如何防止滚动直到页面加载

ios - 如何在 swift 中将数组传递给另一个 View Controller ?

python - 如何从python中的文本文件中获取 float ?

javascript - 如何根据关键字过滤器切换 div 的可见性