我需要根据值数组在数组中找到一个对象,然后删除它们,当我只需要找到一个项目时,这很容易,我这样做了:
if (mdl.findObjectByKey(response, 'cat_id', 171) == true) {
console.log("item removed from dropdown");
var catId = response.map(item => item.cat_id).indexOf(171);
response.splice(catId, 1);
}
这将从对象数组中删除带有cat_id === 171
的项目。
现在我需要删除更多项目,因此它看起来像这样:
var itemsToRemove = [171, 182, 199, 234];
if (mdl.findObjectByKey(response, 'cat_id', itemsToRemove) == true) {
console.log("item removed from dropdown");
var catId = response.map(item => item.cat_id).indexOf(itemsToRemove);
response.splice(catId, 1);
}
显然,上面的例子根本不起作用,我只是想解释一下我需要的东西。
答案 0 :(得分:1)
您只是为了删除单个对象而进行多次传递。你当然不希望保持这种方式,更不用说重复删除每个密钥的所有传递。
只需将集合过滤到没有要移除的键的集合。使用Set
可以避免重复的线性搜索。
var itemsToRemove = new Set([171, 182, 199, 234]);
var filtered = response.filter(obj => !itemsToRemove.has(obj.cat_id));
如果您需要改变原始集合,则可以将其复制。
filtered.forEach((obj, i) => response[i] = obj);
response.length = filtered.length;
您还可以通过复制对象以保留原始数组的当前索引,减去已删除项目数的偏移量,在单个过程中执行上述操作。然后只调整最后的长度。
答案 1 :(得分:0)
正如您所发现的那样,您无法将一组数字传递给想要一个数字的函数。相反,您可以使用for
循环并遍历每个数字。
var itemsToRemove = [171, 182, 199, 234];
for (var i = 0; i < itemsToRemove.length; i++) {
var id = itemsToRemove[i];
if (mdl.findObjectByKey(response, 'cat_id', id) == true) {
var catId = response.map(item => item.cat_id).indexOf(item);
response.splice(catId, 1);
}
}
或使用for..of
循环(和其他一些新的细节):
const itemsToRemove = [171, 182, 199, 234];
for (let id of itemsToRemove) {
if (mdl.findObjectByKey(response, 'cat_id', id)) {
let catId = response.map(item => item.cat_id).indexOf(item);
response.splice(catId, 1);
}
}