这似乎是一件容易的事,但是由于某种原因而卡住了!我尝试了在SE中找到的几种解决方案,主要是递归地迭代数组/对象,例如 How to iterate over an array and remove elements in JavaScript和Looping through array and removing items, without breaking for loop(还有许多其他),但没有运气!
我有这个数组
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test0"
},
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore0"
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test1"
},
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore1"
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test2"
},
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore2"
}
]
}
]
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test3"
},
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore3"
}
]
}
],
"valid": true
}
并且我想删除所有sessionIgnore元素
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test0"
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test1"
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test2"
}
]
}
]
},
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test3"
}
]
}
],
"valid": true
}
我的情况似乎是什么问题: 在这两种情况下,我都递归地遍历数组
delete x/array.slice()
方法:
似乎保留了对一个空数组元素的引用,然后我不得不调用一个清理方法,而我宁愿避免这种情况感谢您的帮助!
编辑: 万一规则对象中只有一个sessionIgnore元素,我希望删除整个部分 即引用上面的数组,如果值为``ignore2''的sessionIgnore是其``规则''组中的唯一对象,则我希望删除整个部分 编辑2: 添加了预期的结果
与nina的对话有关的编辑:
如果对象是这样的:
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test1"
},
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore1"
},
{
"condition": "AND",
"rules": [
{
"id": "sessionIgnore",
"type": "string",
"input": "text",
"operator": "equal",
"value": "ignore2"
}
]
}
]
}
我想要这个
{
"condition": "AND",
"rules": [
{
"id": "loc1",
"type": "string",
"input": "text",
"operator": "equal",
"value": "test1"
}
]
}
答案 0 :(得分:1)
您可以通过检查rules
是否存在id
来过滤rules
,也可以过滤此属性。
function remove(o) {
if (o.id === "sessionIgnore") return false;
if (o.rules) o.rules = o.rules.filter(remove);
return true;
}
var data = { condition: "AND", rules: [{ id: "loc1", type: "string", input: "text", operator: "equal", value: "test0" }, { id: "sessionIgnore", type: "string", input: "text", operator: "equal", value: "ignore0" }, { condition: "AND", rules: [{ id: "loc1", type: "string", input: "text", operator: "equal", value: "test1" }, { id: "sessionIgnore", type: "string", input: "text", operator: "equal", value: "ignore1" }, { condition: "AND", rules: [{ id: "loc1", type: "string", input: "text", operator: "equal", value: "test2" }, { id: "sessionIgnore", type: "string", input: "text", operator: "equal", value: "ignore2" }] }] }, { condition: "AND", rules: [{ id: "loc1", type: "string", input: "text", operator: "equal", value: "test3" }, { id: "sessionIgnore", type: "string", input: "text", operator: "equal", value: "ignore3" }] }], valid: true };
remove(data);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }