使用jQuery或JavaScript使用另一个数组筛选数组
我正在尝试从另一个数组“outputdata”中筛选具有键值的数组“arrSOPrecods”。第一个数组“arrSOPrecods”包含针对特定SOP进行培训的用户的记录第二个数组“outputdata”包含针对已针对特定SOP进行培训的用户的记录我需要从arrSOprecords中筛选出outputdata中存在的记录。我尝试过许多不同的方法,比如jQuery过滤器、JavaScript for loop以及它自己的.filter函数,虽然进展不大,但没有什么用处。下面是数据示例以及最终输出应该是什么使用jQuery或JavaScript使用另一个数组筛选数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我正在尝试从另一个数组“outputdata”中筛选具有键值的数组“arrSOPrecods”。第一个数组“arrSOPrecods”包含针对特定SOP进行培训的用户的记录第二个数组“outputdata”包含针对已针对特定SOP进行培训的用户的记录我需要从arrSOprecords中筛选出outputdata中存在的记录。我尝试过许多不同的方法,比如jQuery过滤器、JavaScript for loop以及它自己的.filter函数,虽然进展不大,但没有什么用处。下面是数据示例以及最终输出
var arrSOPrecords = [
{ User: "Cesar", SOP: "training 1" },
{ User: "Cesar", SOP: "training 2" },
{ User: "Jon", SOP: "training 1" },
{ User: "Jon", SOP: "training 2" },
{ User: "Ana", SOP: "training 1" },
{ User: "Ana", SOP: "training 2" }
];
var outputdata = [
{ User: "Cesar", SOP: "training 1" },
{ User: "Cesar", SOP: "training 2" },
{ User: "Ana", SOP: "training 1" },
{ User: "Jon", SOP: "training 1" }
];
最终的输出数组
var filtered = [
{ User: "Ana", SOP: "training 2" },
{ User: "Jon", SOP: "training 2" }
];
您可以对项目使用哈希表,然后排除和筛选记录
var-arrSOPrecords=[{User:“Cesar”,SOP:“training 1”},{User:“Cesar”,SOP:“training 2”},{User:“Jon”,SOP:“training 2”},{User:“Ana”,SOP:“training 1”},{User:“Ana”,SOP:“training 2”},
outputdata=[{用户:“Cesar”,SOP:“培训1”},{用户:“Cesar”,SOP:“培训2”},{用户:“Ana”,SOP:“培训1”},{用户:“Jon”,SOP:“培训1”},
过滤,
hash=Object.create(null);
outputdata.forEach(函数(a){
hash[a.User+'|'+a.SOP]=true;
});
filtered=arrSOPrecords.filter(函数(a){
return!散列[a.User+'|'+a.SOP];
});
console.log(过滤)
您可以在两个数组上使用map()
并返回User+SOP
的字符串,然后使用indexOf()
进行筛选
var-arrSOPrecords=[{User:“Cesar”,SOP:“training 1”},{User:“Cesar”,SOP:“training 2”},{User:“Jon”,SOP:“training 2”},{User:“Ana”,SOP:“training 1”},{User:“Ana”,SOP:“training 2”};
var outputdata=[{用户:“Cesar”,SOP:“培训1”},{用户:“Cesar”,SOP:“培训2”},{用户:“Ana”,SOP:“培训1”},{用户:“Jon”,SOP:“培训1”}]
var a=arrSOPrecords.map(e=>e.User+e.SOP);
var b=outputdata.map(e=>e.User+e.SOP);
var result=arrSOPrecords.filter(函数(e,i){
返回b.indexOf(a[i])=-1;
});
console.log(结果)
您可以尝试使用array筛选第一个数组。某些方法:
var-arrSOPrecords=[{User:“Cesar”,SOP:“training 1”},{User:“Cesar”,SOP:“training 2”},{User:“Jon”,SOP:“training 2”},{User:“Ana”,SOP:“training 1”},{User:“Ana”,SOP:“training 2”};
var outputdata=[{用户:“Cesar”,SOP:“培训1”},{用户:“Cesar”,SOP:“培训2”},{用户:“Ana”,SOP:“培训1”},{用户:“Jon”,SOP:“培训1”}]
var r=arrSOPrecords.filter(x=>!outputdata.some(y=>\uu.isEqual(y,x)))
console.log(r)
+
var arrSOPrecords=[
{用户:“Cesar”,SOP:“培训1”},
{用户:“Cesar”,SOP:“培训2”},
{用户:“Jon”,SOP:“培训1”},
{用户:“Jon”,SOP:“培训2”},
{用户:“Ana”,SOP:“培训1”},
{用户:“Ana”,SOP:“培训2”}
];
变量输出数据=[
{用户:“Cesar”,SOP:“培训1”},
{用户:“Cesar”,SOP:“培训2”},
{用户:“Ana”,SOP:“培训1”},
{用户:“Jon”,SOP:“培训1”}
];
var filtered=arrSOPrecords.filter(函数(r){
return!outputdata.some(函数(t){
返回r.User==t.User&&r.SOP==t.SOP;
});
});
log(JSON.stringify(过滤))
以下是使用Array.filter
和Array.indexOf
函数的简单解决方案:
var filtered = [], trained = {};
outputdata.forEach(function(o) {
trained[o.User] = trained[o.User] || [];
trained[o.User].push(o.SOP);
});
filtered = arrSOPrecords.filter(function(o) {
return !trained[o.User] || trained[o.User].indexOf(o.SOP) === -1;
});
console.log(JSON.stringify(filtered, 0 , 4));
输出:
[
{
"User": "Jon",
"SOP": "training 2"
},
{
"User": "Ana",
"SOP": "training 2"
}
]
我喜欢为这些问题提供通用的、可重用的解决方案。下面的代码将列出在作为参数提供的数组中缺少的被调用的数组中存在的对象。我们使用两种通用方法
Object.prototype.compare()
和Array.prototype.diference()
Object.prototype.compare=函数(o){
var ok=Object.keys(这个);
返回typeof o==“object”&&ok.length==object.keys(o.length?ok.every(k=>this[k]==o[k]):false;
};
Array.prototype.difference=函数(a){
返回这个.filter(e=>!a.some(f=>f.compare(e));
};
var arrSOP=[
{用户:“Cesar”,SOP:“培训1”},
{用户:“Cesar”,SOP:“培训2”},
{用户:“Jon”,SOP:“培训1”},
{用户:“Jon”,SOP:“培训2”},
{用户:“Ana”,SOP:“培训1”},
{用户:“Ana”,SOP:“培训2”}
],
输出数据=[
{用户:“Cesar”,SOP:“培训1”},
{用户:“Cesar”,SOP:“培训2”},
{用户:“Ana”,SOP:“培训1”},
{用户:“Jon”,SOP:“培训1”}
],
过滤=误差差(输出数据);
log(JSON.stringify(过滤))代码>我尝试了几个建议,这一个似乎很有技巧,感谢每个人的建议,你们都很棒,我非常感谢