我有一个数组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 数组内,并使用 every
和 Object.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/