在有2个数组要检查或比较时使用javascript过滤

在有2个数组要检查或比较时使用javascript过滤,javascript,arrays,sorting,filtering,Javascript,Arrays,Sorting,Filtering,当我有两个大对象并且必须在过滤过程中比较它们时,在javascript中使用过滤方法会遇到一些问题 为了简单起见,我创建了一个示例,其中有两个数组:array_1和array_2 应根据数组_1中存在的id筛选数组_2。(每个阵列中的这些id相同) 如您所见,在数组_2中,我们有一个容量集。我正在尝试基于容量进行过滤,我想过滤数组_2,因此在过滤之后,它包括每个具有容量的对象(大于0,但也包括与一次性数组_1匹配的对象) 如果您应该在没有太多for循环的情况下创建一个很好的解决方案,那么如何做到

当我有两个大对象并且必须在过滤过程中比较它们时,在javascript中使用过滤方法会遇到一些问题

为了简单起见,我创建了一个示例,其中有两个数组:array_1和array_2

应根据数组_1中存在的id筛选数组_2。(每个阵列中的这些id相同)

如您所见,在数组_2中,我们有一个容量集。我正在尝试基于容量进行过滤,我想过滤数组_2,因此在过滤之后,它包括每个具有容量的对象(大于0,但也包括与一次性数组_1匹配的对象)

如果您应该在没有太多for循环的情况下创建一个很好的解决方案,那么如何做到这一点呢

这在1-2行中都可能吗

已经尝试过内部的过滤和forEach,但似乎无法创建一个简单的解决方案,即不要占用太多空间

array_2 = array_2.filter(function (i) {
    array_1.forEach(j => {
        if (j.id == i.id) {
            console.log("ID matches")
            // How to return??
        }
    })
})
输出应为以下对象:

{ id: '_h6yf2uk1n', description: 'text', capacity: 2 },
{ id: '_465324423', description: 'text', capacity: 4 },
{ id: '_i23455szq', description: 'text', capacity: 0 },

您正在筛选器中查找两个条件的逻辑OR(
|
)。首先检查容量,以便在
容量>0
时无需搜索
数组_1
。如果
capacity
不大于
0
,则可以在
array\u 1
中搜索具有相同
id
的对象

const数组_1=[
{id:''ui23455szq',说明:'text'},
{id:''uh6yf2uk1n',说明:'text'}
]
常量数组_2=[
{id:''uh6yf2uk1n',说明:'text',容量:2},
{id:''u 465324423',说明:'text',容量:4},
{id:'_i23455szq',说明:'text',容量:0},
{id:''u 54234gfgd',说明:'text',容量:0},
]
常量结果=数组_2.过滤器(obj=>
obj.capacity>0 | |数组1.some({id})=>id==obj.id)
);

控制台日志(结果)
可能最好提前对
数组1
id
进行
设置(
Set
查找比任何其他类型的
查找快得多。一些
/
数组查找的索引)。然后,您只需要
.filter
,从
array2
中提取
id
capacity
属性,并检查
id
是否在id集合中,或者容量是否大于0。当使用像
这样的数组方法时,它的复杂性是
O(N)
。在
中的一些
。过滤器
将具有
O(N^2)

让数组1=[
{id:''ui23455szq',说明:'text'},
{id:''uh6yf2uk1n',说明:'text'}
]
设array2=[
{id:''uh6yf2uk1n',说明:'text',容量:2},
{id:''u 465324423',说明:'text',容量:4},
{id:'_i23455szq',说明:'text',容量:0},
{id:''u 54234gfgd',说明:'text',容量:0},
]
const-id=新集合(array1.map(({id})=>id));
console.log(
array2.filter(({id,capacity})=>ids.has(id)| capacity>0)

);array_2=array_2.filter(i=>i.capacity | | array_1.some(j=>i.id==j.id))

为什么包括第二个对象,id
\u 465324423
在第一个数组中不存在?因为它的容量大于0,所以如果一个匹配arrray\u 1但容量为0,那么它也应该包括在内。啊,所以条件是or,而不是and,得到了绝对漂亮的答案,快速而简短。谢谢,祝您愉快,先生。欢迎光临SO!你能解释一下你想说什么吗?
{ id: '_h6yf2uk1n', description: 'text', capacity: 2 },
{ id: '_465324423', description: 'text', capacity: 4 },
{ id: '_i23455szq', description: 'text', capacity: 0 },