【问题标题】:How to convert json array object to json array如何将json数组对象转换为json数组
【发布时间】:2019-01-25 05:45:03
【问题描述】:

** 场景:**

  • 我正在使用 lodash 从我的 JSON 中删除空键。
  • 但是当它删除键时,它会将我的数组转换为一个对象,例如

    {
    "projection": "Miller",
    "series": [
        {
            "mapPolygons": {
            "states": {
                "hover": {
                    "properties": {
                        "fill": "#67b7dc"
                    }
                }
            }
        },
        "heatRules": {
            "0": {
                "min": "#a82626",
                "max": "#AAAA00"              
            }
        },
        "data": {
            "0": {
                "id": "US",
                "value": 3461.37
            },
            "1": {
                "id": "DE",
                "value": 2858.09
            },
            "2": {
                "id": "NO",
                "value": 3418.87
            },
            "3": {
                "id": "ES",
                "value": 3522.46
            }
        }
    }
    ],
     "zoomControl": {
    "slider": {
        "height": 100
    }
    },
      "titles": {
        "0": {
        "fontSize": 20
        }
    },
    "homeZoomLevel": 1
    }
    

问题:

如果你在上面的代码中看到有 heatRules 属性,它是一个数组,它转换为 0 的对象后,再次如果你看到 data 属性,如果你看到 title 属性它在那里做同样的事情。

我使用下面的链接代码来删除空对象和空对象:

Why lodash converts my array into object?

输入数据:

    {
"projection": "Miller",
"series": [
    {
    "mapPolygons": {
    "states": {
        "hover": {
            "properties": {
                "fill": "#67b7dc",
                "size": ""
            }
        }
    }
},
"heatRules": [
     {
        "min": "#a82626",
        "max": "#AAAA00",
         "fill": null              
    }
],
"data": [
    {
        "id": "US",
        "value": 3461.37
    },
    {
        "id": "DE",
        "value": 2858.09
    },
    {
        "id": "NO",
        "value": 3418.87
    },
    {
        "id": "ES",
        "value": 3522.46
    }
]
}
],
     "zoomControl": {
"slider": {
    "height": 100
}
},
  "titles": [
   {
    "fontSize": 20,
   "fontColor": "" 
    }
],
"homeZoomLevel": 1
}

输出数据:

{
"projection": "Miller",
"series": [
    {
    "mapPolygons": {
    "states": {
        "hover": {
            "properties": {
                "fill": "#67b7dc"
            }
        }
    }
},
"heatRules": [
     {
        "min": "#a82626",
        "max": "#AAAA00"              
    }
],
"data": [
    {
        "id": "US",
        "value": 3461.37
    },
    {
        "id": "DE",
        "value": 2858.09
    },
    {
        "id": "NO",
        "value": 3418.87
    },
    {
        "id": "ES",
        "value": 3522.46
    }
]
}
],
     "zoomControl": {
"slider": {
    "height": 100
}
},
  "titles": [
   {
    "fontSize": 20 
    }
],
"homeZoomLevel": 1
}

如果您看到上面的输出,它会从属性 -> 大小、heatRulees -> 填充中删除 null 和空白键,并从标题中删除 fontColor。

【问题讨论】:

  • 请分享您的输入样本数据
  • 还有预期的输出。
  • @ArshpreetWadehra 我提供了输入数据。
  • @holydragon 我也提供了预期的输出。

标签: javascript jquery json angular6 lodash


【解决方案1】:

如果你的代码使用了

typeof v === 'object'

它将为arrays返回true

要检查array,请使用

Array.isArray(t)

array 视为object 并迭代键将导致您的问题。

递归但不处理数组的示例函数

function removeFalsies(obj) {
  return _.transform(obj, function(o, v, k, l) {
      if (Array.isArray(obj) {
          for (let arrItem of obj) {
            removeFalsies(arrItem);
          }
          return
        }
        // else not array...
      })
  }

【讨论】:

  • 谢谢,@steven-spungin 能否请您更新功能。
  • @Mayur 我在你的问题中没有看到function。您指的是链接的答案吗?如果是这样,我添加了一个修改,应该处理数组中的项目而不是提供的代码。
【解决方案2】:

步骤

  1. 遍历 heatRules 属性(因为它是数组,所以其中可能有多个对象)
  2. 遍历 heatRules 中每个对象的属性
  3. 删除所有值为 null 的属性

let data = {
  "projection": "Miller",
  "series": [{
    "mapPolygons": {
      "states": {
        "hover": {
          "properties": {
            "fill": "#67b7dc",
            "size": ""
          }
        }
      }
    },
    "heatRules": [{
      "min": "#a82626",
      "max": "#AAAA00",
      "fill": null
    }],
    "data": [{
        "id": "US",
        "value": 3461.37
      },
      {
        "id": "DE",
        "value": 2858.09
      },
      {
        "id": "NO",
        "value": 3418.87
      },
      {
        "id": "ES",
        "value": 3522.46
      }
    ]
  }],
  "zoomControl": {
    "slider": {
      "height": 100
    }
  },
  "titles": [{
    "fontSize": 20,
    "fontColor": ""
  }],
  "homeZoomLevel": 1
}

data.series[0].heatRules.forEach(hr => {
  Object.keys(hr).forEach(p => {
    if (hr[p] === null) {
      delete hr[p]
    }
  })
})

console.log(data)

【讨论】:

    【解决方案3】:

    我试过Why lodash converts my array into object? 例如及其工作。检查下面的代码。

    let a = {
      "projection": "Miller",
      "series": [
        {
          "mapPolygons": {
            "states": {
              "hover": {
                "properties": {
                  "fill": "#67b7dc",
                  "size": ""
                }
              }
            }
          },
          "heatRules": [
            {
              "min": "#a82626",
              "max": "#AAAA00",
              "fill": null
            }
          ],
          "data": [
            {
              "id": "US",
              "value": 3461.37
            },
            {
              "id": "DE",
              "value": 2858.09
            },
            {
              "id": "NO",
              "value": 3418.87
            },
            {
              "id": "ES",
              "value": 3522.46
            }
          ]
        }
      ],
      "zoomControl": {
        "slider": {
          "height": 100
        }
      },
      "titles": [
        {
          "fontSize": 20,
          "fontColor": ""
        }
      ],
      "homeZoomLevel": 1
    }
    
    removeFalses = (obj)=> {
        return _.transform(obj, function (o, v, k) {
    
          if (v && typeof v === 'object' && !_.isArray(v)) {
    
            if (v !== '') {
              o[k] = removeFalses(v);
            }
    
          } else if(_.isArray(v)) {
      if(!o.hasOwnProperty(k)) o[k] = [];
    
      //And if it is array loop through it
    
      _.forEach(v, function(v1, k1) {
         o[k].push(removeFalses(v1));
      });
    
      }else if (v === false) {
            o[k] = v;
          } else if (v) {
            o[k] = v;
          }
        });
      }
    
    console.log(removeFalses(a)) //desired output
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多