Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将一个对象数组与其他两个对象数组进行筛选时出现意外结果_Javascript_Arrays_Object - Fatal编程技术网

Javascript 将一个对象数组与其他两个对象数组进行筛选时出现意外结果

Javascript 将一个对象数组与其他两个对象数组进行筛选时出现意外结果,javascript,arrays,object,Javascript,Arrays,Object,我试图从数组“a”中筛选出与数组“b”和“c”中的对象匹配的对象。下面是测试代码的链接 以下是我目前拥有的: const a=[{ “姓名”:“sondre”, “uq_id”:“abc1” }, { “姓名”:“索菲”, “uq_id”:“abc2” }, { “姓名”:“卡斯珀”, “uq_id”:“abc3” }, { “姓名”:“奥丁”, “uq_id”:“abc4” }]; 常数b=[{ “姓名”:“sondre”, “uq_id”:“abc1” }, { “姓名”:“奥丁”, “u

我试图从数组“a”中筛选出与数组“b”和“c”中的对象匹配的对象。下面是测试代码的链接

以下是我目前拥有的:

const a=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“索菲”,
“uq_id”:“abc2”
}, {
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数b=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数c=[{
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}];
函数排序(a、b、c){
结果=[];
控制台日志(结果);
如果(b!==null){
结果=a.过滤器(功能(项目){
退货!b.包括(商品编号);
})
}
如果(c!==null){
结果=结果过滤器(函数(项){
退货!c.包括(商品编号);
})
}
控制台日志(结果);
}

排序(a、b、c)
如果目标是从
a
中筛选出与
b
c
上的条目相匹配的
a
b
c
中的条目,则不能使用
includes
,除非
a
c
中的条目引用了相同的对象(而不仅仅是等价的对象)

假设它们没有,您可以使用
some
来确定数组是否包含与
名称
匹配的内容。您需要使用
&&
查看
b
c
中是否没有匹配项:

const filtered = a.filter(entry => {
    return !b.some(({name}) => entry.name === name) &&
           !c.some(({name}) => entry.name === name);
});
实时复制:

const a=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“索菲”,
“uq_id”:“abc2”
}, {
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数b=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数c=[{
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}];
函数过滤器(a、b、c){
const filtered=a.filter(条目=>{
return!b.some(({name})=>entry.name==name)&&
!c.some({name}=>entry.name==name);
});
返回过滤;
}

日志(过滤器(a、b、c))
b
c
是对象数组,它只包含对象。您需要在上使用
some()
来比较
uq\u id

const a=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“索菲”,
“uq_id”:“abc2”
}, {
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数b=[{
“姓名”:“sondre”,
“uq_id”:“abc1”
}, {
“姓名”:“奥丁”,
“uq_id”:“abc4”
}];
常数c=[{
“姓名”:“卡斯珀”,
“uq_id”:“abc3”
}];
排序(a、b、c);
函数排序(a、b、c){
让结果=[];
如果(b!==null){
结果=a.过滤器(功能(项目){
return!b.some(x=>x.uq\u id==item.uq\u id);
})
}
如果(c!==null){
结果=结果过滤器(函数(项){
return!c.some(x=>x.uq\u id==item.uq\u id);
})
}
控制台日志(结果);

}
单个过滤器就足够了:

const a=[{“name”:“sondre”,“uq_id”:“abc1”},
{“name”:“sofie”,“uq_id”:“abc2”},
{“name”:“casper”,“uq_id”:“abc3”},
{“name”:“odin”,“uq_id”:“abc4”}];
常量b=[{“name”:“sondre”,“uq_id”:“abc1”},
{“name”:“odin”,“uq_id”:“abc4”}];
常量c=[{“name”:“casper”,“uq_id”:“abc3”}];
const result=a.filter(x=>!b.some(y=>x.uq\u id===y.uq\u id)
&&!c.some(y=>x.uq_id==y.uq_id));

控制台日志(结果)“这里有一个指向JSFIDLE的链接来测试代码”请在这里使用堆栈片段(
[]
工具栏按钮;)执行可运行的示例。为什么该函数名为
排序
?它不做任何排序。^实际上,它做更多的“筛选”。或者更确切地说是三个数组之间的交集。很抱歉,我有一个愚蠢的逻辑错误(和输入错误),在做可运行的示例之前我没有发现-/这个句柄B或C是空的、未定义的还是空的?@SondreLjovshin-empty不是问题。如果它们可能是
未定义的
空的
,您将需要处理它们。在开始筛选之前,最简单的方法可能是
if(!b){b=[];}if(!c){c=[];}
。感谢您的回答,这似乎可以以最有效的方式解决我的问题