gpt4 book ai didi

JavaScript 根据另一个对象数组的属性过滤对象数组

转载 作者:行者123 更新时间:2023-11-30 07:12:43 26 4
gpt4 key购买 nike

我有 2 个对象数组

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.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;
}

关于JavaScript 根据另一个对象数组的属性过滤对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com