删除数组中的数组元素

尼扎姆

嗨,我正在尝试删除array数组中的一个元素。我的模式是:

var mySchema = Schema({ 
  primaryField:String,
  list1: [{
    item1: String,
    item2:String
  }],
  list2 : [{
  item3:String,
    item4 : [String]//item4 is string values available in item1
  }]
});

例如:

{
  "primaryField": "abc",
  "list1": [{
    "item1": "aa",
    "item2": "mystring"
  },{
    "item1": "bb",
    "item2": "sampStr"
  }],
  "list2": [{
    "item3": "stringitem",
    "item4": ["aa", "bb"]
  },{
    "item3": "sample",
    "item4": ["bb"]
  },{
    "item3": "samplestring",
    "item4": ["aa"]
  }]
}

我必须从中删除"aa"项目list1以及"aa"in中的出现list2.item4,如果仅存"aa"在于其中,item4那么我必须删除整个对象条目。

我的输出应该是:

{
  "primaryField": "abc",
  "list1": [{
    "item1": "bb",
    "item2": "sampStr"
  }],
  list2:[{
    "item3": "stringitem",
    "item4": ["bb"]
  },{
    "item3": "sample",
    "item4": ["bb"]
  }]
}

谁能帮助我使用node.js和mongoose来实现这一目标。架构无法修改。

亚尼克·罗雄(Yanick Rochon)

这将产生预期的输出。它应该足够通用,并且我不确定它是否可以与您的代码一起使用,但是鉴于问题中指定的内容,我认为应该没问题。

function removeAllItems(obj, value) {
  var deleted;

  if (!obj) {
    return false;
  }

  if (obj === value) {
    deleted = true;
  } else if (Array.isArray(obj)) {
    for (var i = 0, len = obj.length; i < len; ++i) {
      if (removeAllItems(obj[i], value)) {
        obj.splice(i--, 1);

        if (!obj.length) {
          deleted = true;
        }
      }
    }
  } else if (typeof obj === 'object') {
    for (var keys = Object.keys(obj), key, i = 0, len = keys.length; i < len; ++i) {
      if (removeAllItems(obj[keys[i]], value)) {
        delete obj[keys[i]];

        deleted = true;
      }
    }
  }

  return deleted;
}

经过测试:

var test = {
  "primaryField": "abc",
  "list1": [{
    "item1": "aa",
    "item2": "mystring"
  },{
    "item1": "bb",
    "item2": "sampStr"
  }],
  "list2": [{
    "item3": "stringitem",
    "item4": ["aa", "bb"]
  },{
    "item3": "sample",
    "item4": ["bb"]
  },{
    "item3": "samplestring",
    "item4": ["aa"]
  }]
};

var valueToRemove = 'aa';

removeAllItems(test, valueToRemove);
console.log('Removing all', valueToRemove, JSON.stringify(test, null, 2));

给出结果

Removing all aa {
  "primaryField": "abc",
  "list1": [
    {
      "item1": "bb",
      "item2": "sampStr"
    }
  ],
  "list2": [
    {
      "item3": "stringitem",
      "item4": [
        "bb"
      ]
    },
    {
      "item3": "sample",
      "item4": [
        "bb"
      ]
    }
  ]
}

这是一个更新,其中考虑了循环引用,并返回true是否删除了任何值,false否则返回。

function removeAllItems(obj, value) {
  var stack = [];
  var found = false;

  function _next(obj) {
    var deleted;

    if (!obj) {
      return false;
    } else if (stack.indexOf(obj) >= 0) {
      return false;   // cyclical reference found
    }

    stack.push(obj);

    if (obj === value) {
      found = deleted = true;
    } else if (Array.isArray(obj)) {
      for (var i = 0, len = obj.length; i < len; ++i) {
        if (_next(obj[i])) {
          obj.splice(i--, 1);

          if (!obj.length) {
            deleted = true;
          }
        }
      }
    } else if (typeof obj === 'object') {
      for (var keys = Object.keys(obj), key, i = 0, len = keys.length; i < len; ++i) {
        if (_next(obj[keys[i]])) {
          delete obj[keys[i]];

          deleted = true;
        }
      }
    }

    stack.pop();

    return deleted;
  }

  return _next(obj), found;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章