我尝试过滤一个带有来自'outputdata‘的键值的数组'arrSOPrecods’另一个数组。第一个数组'arrSOPrecods‘包含要针对特定SOP进行训练的用户的记录,第二个数组' outputdata’包含已经针对特定SOP进行训练的用户的记录。我需要从arrSOprecords的outputdata中筛选出存在于outputdata中的记录。我尝试了许多不同的方法,比如jQuery过滤器,JavaScript for循环以及它自己的.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" }
];发布于 2016-06-14 22:07:14
你可以对项目使用哈希表,你想排除和过滤记录。
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" }],
outputdata = [{ User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Jon", SOP: "training 1" }],
filtered,
hash = Object.create(null);
outputdata.forEach(function (a) {
hash[a.User + '|' + a.SOP] = true;
});
filtered = arrSOPrecords.filter(function (a) {
return !hash[a.User + '|' + a.SOP];
});
console.log(filtered);
发布于 2016-06-14 22:11:35
您可以在两个数组上使用map()并返回User + SOP字符串,然后使用indexOf()进行筛选
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 a = arrSOPrecords.map(e => e.User+e.SOP);
var b = outputdata.map(e => e.User+e.SOP);
var result = arrSOPrecords.filter(function(e, i) {
return b.indexOf(a[i]) == -1;
});
console.log(result)
更新:实际上你可以在第二个数组上使用map,然后像这样使用过滤器
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 a = outputdata.map(e => e.User+e.SOP);
var result = arrSOPrecords.filter(function(el) {
return a.indexOf(el.User+el.SOP) == -1;
})
console.log(result)
发布于 2016-06-14 22:16:56
Array.prototype.filter() + Array.prototype.some()
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 = arrSOPrecords.filter(function(r) {
return !outputdata.some(function(t) {
return r.User === t.User && r.SOP === t.SOP;
});
});
console.log(JSON.stringify(filtered));
https://stackoverflow.com/questions/37814161
复制相似问题