嗨,我正在尝试删除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来实现这一目标。架构无法修改。
这将产生预期的输出。它应该足够通用,并且我不确定它是否可以与您的代码一起使用,但是鉴于问题中指定的内容,我认为应该没问题。
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] 删除。
我来说两句