簡體   English   中英

JavaScript根據另一個對象數組的屬性過濾對象數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM