我有一个数组,其中包含名称列表。如果这些名称与另一个数组中的键/值对匹配,我想删除包含匹配项的对象并返回没有该对象的数组。
这是我到目前为止的一个例子:
var supervisorsToRemove = ["Supervisor1", "Supervisor2"];
var data = [{id: "Name1", supervisor: "Supervisor1"},{id: "Name2", supervisor: "Supervisor1"},{id: "Name3", supervisor: "Supervisor2"},{id: "Name4", supervisor: "Supervisor3"}]
我希望生成的数据数组为:
data = [{id: "Name4", supervisor: "Supervisor3"}]
我可以通过以下方式删除一位主管的对象:
var supervisorsToRemove = "Supervisor1";
data = $.grep(data, function(e){
return e.supervisor != supervisorsToRemove;
});
但是当我尝试删除数组中的所有内容时,它不起作用:
var supervisorsToRemove = ["Supervisor1","Supervisor2"];
data = $.grep(data, function(e){
return e.supervisor != supervisorsToRemove;
});
最佳答案
使用Array#indexOf
方法(或 Array#includes
方法)检查数组中存在的元素
data = $.grep(data, function(e){
return supervisorsToRemove.indexOf(e.supervisor) == -1;
// or return supervisorsToRemove.includes(e.supervisor);
});
var supervisorsToRemove = ["Supervisor1", "Supervisor2"];
var data = [{
id: "Name1",
supervisor: "Supervisor1"
}, {
id: "Name2",
supervisor: "Supervisor1"
}, {
id: "Name3",
supervisor: "Supervisor2"
}, {
id: "Name4",
supervisor: "Supervisor3"
}]
console.log($.grep(data, function(e) {
return supervisorsToRemove.indexOf(e.supervisor) == -1;
// or return supervisorsToRemove.includes(e.supervisor);
}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
更好的方法是使用一个将主管值作为属性的对象,这将有助于加快速度,因为 Array#indexOf
方法较慢。
var supervisorsToRemove = {"Supervisor1" : true, "Supervisor2" : true };
data = $.grep(data, function(e){
return !supervisorsToRemove[e.supervisor];
});
var data = [{
id: "Name1",
supervisor: "Supervisor1"
}, {
id: "Name2",
supervisor: "Supervisor1"
}, {
id: "Name3",
supervisor: "Supervisor2"
}, {
id: "Name4",
supervisor: "Supervisor3"
}]
var supervisorsToRemove = {
"Supervisor1": true,
"Supervisor2": true
};
console.log(
$.grep(data, function(e) {
return !supervisorsToRemove[e.supervisor];
})
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
如果您无法控制数组,则使用 Array#reduce
生成对象方法。
var obj = supervisorsToRemove.reduce(function(obj, v){ obj[v] = true; return obj; }, {});
data = $.grep(data, function(e){
return !obj[e.supervisor];
});
var supervisorsToRemove = ["Supervisor1", "Supervisor2"];
var data = [{
id: "Name1",
supervisor: "Supervisor1"
}, {
id: "Name2",
supervisor: "Supervisor1"
}, {
id: "Name3",
supervisor: "Supervisor2"
}, {
id: "Name4",
supervisor: "Supervisor3"
}]
var supervisorsToRemove = {
"Supervisor1": true,
"Supervisor2": true
};
var obj = supervisorsToRemove.reduce(function(obj, v) {
obj[v] = true;
return obj;
}, {});
console.log(
$.grep(data, function(e) {
return !obj[e.supervisor];
})
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
您甚至可以使用 native Javascript Array#filter
方法。
var supervisorsToRemove = ["Supervisor1", "Supervisor2"];
var data = [{
id: "Name1",
supervisor: "Supervisor1"
}, {
id: "Name2",
supervisor: "Supervisor1"
}, {
id: "Name3",
supervisor: "Supervisor2"
}, {
id: "Name4",
supervisor: "Supervisor3"
}]
var supervisorsToRemove = {
"Supervisor1": true,
"Supervisor2": true
};
console.log(
data.filter(function(e) {
return !supervisorsToRemove[e.supervisor];
})
);
关于jQuery 根据另一个数组从数组中删除多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987576/