假设我有一个以下对象:

{
"schema": [
{
  "field": "name",
  "type": "String",
  "enabled": true
},
{
  "field": "age",
  "type": "Int",
  "enabled": false
},
{
  "field": "modelObj",
  "type": "object",
  "enabled": true,
  "stuff": [
    {
      "name": "mod1",
      "type": "array",
      "enabled": true
    },
    {
      "name": "mod2",
      "type": "String",
      "enabled": false
    },
    {
     "name": "mod3",
      "type": "array",
      "enabled": true
    }
  ]
},
{
  "name": "modelArr",
  "type": "array",
  "enabled": false,
  "elements": {
    "elementsType": "String"
  }
},
{
  "name": "modelsNestedArr",
  "type": "array",
  "enabled": true,
  "elements": {
    "elementsType": "object"
  },
  "stuff": [
    {
      "name": "name",
      "type": "String",
      "enabled": true
    },
    {
      "name": "models",
      "type": "array",
      "enabled": false,
      "elements": {
        "elementsType": "String"
      }
    }
  ]
  }
  ]
  }


我想递归地遍历此对象,并根据“ enabled”是否为false删除该项目。

因此,预期输出为:

[
{
  "field": "name",
  "type": "String",
  "enabled": true
},
{
  "field": "modelObj",
  "type": "object",
  "enabled": true,
  "stuff": [
    {
      "name": "mod1",
      "type": "array",
      "enabled": true
    },
    {
     "name": "mod3",
      "type": "array",
      "enabled": true
    }
  ]
},
{
  "name": "modelsNestedArr",
  "type": "array",
  "enabled": true,
  "elements": {
    "elementsType": "object"
  },
  "stuff": [
    {
      "name": "name",
      "type": "String",
      "enabled": true
    }
  ]
  }
 ]


我写了如下代码:

function r(a){
     for (i = a.length - 1; i >= 0; --i) {
        if(!a[i].enabled){
         a.splice(i,1)
        } else if (a[i].enabled){
            if(a[i].type == "object"){
              if(a[i]){
                a[i].stuff= r(a[i].stuff)
              }
        } else if (a[i].type == "array"){
            if(a[i].hasOwnProperty("elements") && a[i].elements.elementsType== "object"){
               a[i].stuff= r(a[i].stuff)
           }
        }
      }
    }

    return a
    }

    var final = r(a.schema)
    console.log(JSON.stringify(final))


但是我得到以下输出:

错误输出:

[
{
"field": "name",
"type": "String",
"enabled": true
},
{
"field": "age",
"type": "Int",
"enabled": false
},
{
"field": "modelObj",
"type": "object",
"enabled": true,
"stuff": [
  {
    "name": "mod1",
    "type": "array",
    "enabled": true
  },
  {
    "name": "mod2",
    "type": "String",
    "enabled": false
  },
  {
    "name": "mod3",
    "type": "array",
    "enabled": true
  }
]
},
{
"name": "modelArr",
"type": "array",
"enabled": false,
"elements": {
  "elementsType": "String"
}
},
{
"name": "modelsNestedArr",
"type": "array",
"enabled": true,
"elements": {
  "elementsType": "object"
},
"stuff": [
  {
    "name": "name",
    "type": "String",
    "enabled": true
  }
]
}
]


我到底在做什么错?

最佳答案

使用.map()和.filter()的递归函数将使您的生活更轻松:

  function isEnabledRecursive(data){
    return data.filter(
      item=>item.enabled
    )
    .map(
      item=>item.stuff?Object.assign(item,{stuff:isEnabledRecursive(item.stuff)})
      :item
    );
  }
const dataWithFilteredSchema = Object.assign(data, {schema:isEnabledRecursive(data.schema)})


这将适用于任何深度。

它确实假定所有数组都在stuff属性中。如果您有其他带有对象数组的属性,则必须循环使用for(property of item)之类的每个属性来查看它们是否具有数组。

至于为什么原始代码无法正常工作,如果语句正在运行,那么其他代码就什么也没有。当您说a[i].typea[i].dataType时,它是未定义的。您可能想说typeof a[i] === "object"typeof a[i] === "array"

关于node.js - NodeJS:遍历嵌套的JSON并根据条件删除元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55383207/

10-09 21:49