根据值数组在数组中查找对象,然后将其删除

时间:2018-03-13 20:21:23

标签: javascript arrays node.js object

我需要根据值数组在数组中找到一个对象,然后删除它们,当我只需要找到一个项目时,这很容易,我这样做了:

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);
}

显然,上面的例子根本不起作用,我只是想解释一下我需要的东西。

2 个答案:

答案 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);
  }
}