[英]JavaScript Filter array of objects based on property of another array of objects
我有2 array of objects
Tasks
[{
name: "test",
type: "one"
},
{
name: "test2",
type: 'two'
}]
活動
[{
name: "test",
type: "one"
},
{
name: "test2",
type: 'two'
},
{
name: "test3",
type: "three"
}]
如何通過任務數組的屬性過濾活動數組? 我想要這個結果。
活動
[{
name: "test",
type: "one"
},
{
name: "test2",
type: 'two'
}]
我嘗試使用.filter(),但是返回一個空集合。
let tests = activities.filter(x => tasks.includes(x.type));
如何在Javascript中實現?
filter
是正確的工具,但includes
不是。 tasks
中的條目是對象,而不是字符串。 它們都不匹配tests
中的任何類型。
相反,簡單版本使用some
來查看tasks
中是否有任何條目與被測試活動的類型匹配:
let tests = activities.filter(a => tasks.some(t => t.type == a.type));
現場示例:
const tasks = [ { name: "test", type: "one" }, { name: "test2", type: 'two' } ]; const activities = [ { name: "test", type: "one" }, { name: "test2", type: 'two' }, { name: "test3", type: "three" } ]; let tests = activities.filter(a => tasks.some(t => t.type == a.type)); console.log(tests);
.as-console-wrapper { max-height: 100% !important; }
自然地,這意味着對於activities
每個條目至少部分地重新遍歷tasks
。 對於您顯示的示例,這絕對很好; 如果tasks
是成千上萬個條目,或者是在一個緊密的循環中完成的,那么就不那么多了。 :-)
在這種情況下,您可以預先為自己提供一組已知類型的tasks
,然后僅對該組進行測試:
const knownTypes = new Set();
for (const task of tasks) {
knownTypes.add(task.type);
}
let tests = activities.filter(a => knownTypes.has(a.type));
現場示例:
const tasks = [ { name: "test", type: "one" }, { name: "test2", type: 'two' } ]; const activities = [ { name: "test", type: "one" }, { name: "test2", type: 'two' }, { name: "test3", type: "three" } ]; const knownTypes = new Set(); for (const task of tasks) { knownTypes.add(task.type); } let tests = activities.filter(a => knownTypes.has(a.type)); console.log(tests);
.as-console-wrapper { max-height: 100% !important; }
或者,除了Set
您還可以使用一個對象用於knownTypes
,通過Object.create(null)
在可能的情況下通過Object.create(null)
創建它,您的任何類型恰好與Object.prototype
上的屬性Object.prototype
:
const knownTypes = Object.create(null);
for (const task of tasks) {
knownTypes[task.type] = true;
}
let tests = activities.filter(a => knownTypes[a.type]);
現場示例:
const tasks = [ { name: "test", type: "one" }, { name: "test2", type: 'two' } ]; const activities = [ { name: "test", type: "one" }, { name: "test2", type: 'two' }, { name: "test3", type: "three" } ]; const knownTypes = Object.create(null); for (const task of tasks) { knownTypes[task.type] = true; } let tests = activities.filter(a => knownTypes[a.type]); console.log(tests);
.as-console-wrapper { max-height: 100% !important; }
快好了。 嘗試使用.some
數組方法檢查該項目是否存在,因為includes
對於嵌套屬性不起作用。
const tasks = [{ name: "test", type: "one" }, { name: "test2", type: 'two' }] const activities = [{ name: "test", type: "one" }, { name: "test2", type: 'two' }, { name: "test3", type: "three" }] let tests = activities.filter(x => tasks.some(t => t.type === x.type)); console.log(tests)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.