迭代复杂的对象,删除不需要的元素(多个嵌套对象)

时间:2019-05-17 11:48:59

标签: javascript arrays

这似乎是一件容易的事,但是由于某种原因而卡住了!我尝试了在SE中找到的几种解决方案,主要是递归地迭代数组/对象,例如 How to iterate over an array and remove elements in JavaScriptLooping 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()方法: 似乎保留了对一个空数组元素的引用,然后我不得不调用一个清理方法,而我宁愿避免这种情况
  • 我创建了一个arrayRemove()函数,该函数从给定数组中删除了x元素,但是在这种情况下,我似乎遇到了逻辑问题,并且在第二级数组之后我无法解析任何内容

感谢您的帮助!

编辑: 万一规则对象中只有一个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"
        }
      ]
    }

1 个答案:

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