【问题标题】:How to remove all empty array childrens [] from a nested JSON recursively [closed]如何递归地从嵌套的 JSON 中删除所有空数组子项 [] [关闭]
【发布时间】:2020-03-25 07:22:15
【问题描述】:

我有如下 JSON 响应。我正在使用来自 GeoRegionCountries APIController 的嵌套 JSON 数据,自定义类 TreeView 用于根据我正在使用的插件所需的嵌套结构来格式化数据。我正在使用组合多选 Treeview 使用这个 jquery 插件 Multi-Select Drop Down Tree Plugin 你可以通过这个链接看到它jquery plugin Multi-Select Drop Down Tree Plugin

[
          {
            "Id": 1,
            "Title": "United States",
            "ParentId": null,
            "Subs": [
              {
                "Id": 7,
                "Title": "Northwest",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 8,
                "Title": "Northeast",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 9,
                "Title": "Central",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 10,
                "Title": "Southwest",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 18,
                "Title": "Southeast",
                "ParentId": 1,
                "Subs": []
              }
            ]
          },
          {
            "Id": 2,
            "Title": "Canada",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 3,
            "Title": "France",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 4,
            "Title": "Germany",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 5,
            "Title": "Australia",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 6,
            "Title": "United Kingdom",
            "ParentId": null,
            "Subs": []
          }
        ]

我想删除所有带有空数组的“Subs”。

         [
          {
            "Id": 1,
            "Title": "United States",
            "ParentId": null,
            "Subs": [
              {
                "Id": 7,
                "Title": "Northwest",
                "ParentId": 1
              },
              {
                "Id": 8,
                "Title": "Northeast",
                "ParentId": 1
              },
              {
                "Id": 9,
                "Title": "Central",
                "ParentId": 1
              },
              {
                "Id": 10,
                "Title": "Southwest",
                "ParentId": 1
              },
              {
                "Id": 18,
                "Title": "Southeast",
                "ParentId": 1
              }
            ]
          },
          {
            "Id": 2,
            "Title": "Canada",
            "ParentId": null
          },
          {
            "Id": 3,
            "Title": "France",
            "ParentId": null
          },
          {
            "Id": 4,
            "Title": "Germany",
            "ParentId": null
          },
          {
            "Id": 5,
            "Title": "Australia",
            "ParentId": null
          },
          {
            "Id": 6,
            "Title": "United Kingdom",
            "ParentId": null
          }
        ]

深层清洁的最佳方法是什么?我在 Stackopverflow 中尝试了不同的解决方案,但我得到的只是 Object 对象代替了空的 Subs - 这是我不想要的。

      [
          {
            "Id": 1,
            "Title": "United States",
            "ParentId": null,
            "Subs": [
              {
                "Id": 7,
                "Title": "Northwest",
                "ParentId": 1,
                Object object
              },
              {
                "Id": 8,
                "Title": "Northeast",
                "ParentId": 1,
                Object object
              },
              {
                "Id": 9,
                "Title": "Central",
                "ParentId": 1,
                Object object
              },
              {
                "Id": 10,
                "Title": "Southwest",
                "ParentId": 1,
                Object object
              },
              {
                "Id": 18,
                "Title": "Southeast",
                "ParentId": 1,
                Object object
              }
            ]
          },
          {
            "Id": 2,
            "Title": "Canada",
            "ParentId": null,
            Object object
          },
          {
            "Id": 3,
            "Title": "France",
            "ParentId": null,
            Object object
          },
          {
            "Id": 4,
            "Title": "Germany",
            "ParentId": null,
            Object object
          },
          {
            "Id": 5,
            "Title": "Australia",
            "ParentId": null,
            Object object
          },
          {
            "Id": 6,
            "Title": "United Kingdom",
            "ParentId": null,
            Object object
          }
        ]

这不是我想要的

【问题讨论】:

标签: javascript jquery json lodash


【解决方案1】:

您可以使用_.transform() 递归检查特定键(Subs),如果它的值为空,则将其删除:

const { transform, isObject, isEmpty } = _;

const removeEmpty = (obj, key) =>
  transform(obj, (r, v, k) => {
    if(k === key && isEmpty(v)) return;
    r[k] = isObject(v) ? removeEmpty(v, key) : v;
  });

const tree = [{"Id":1,"Title":"United States","ParentId":null,"Subs":[{"Id":7,"Title":"Northwest","ParentId":1,"Subs":[]},{"Id":8,"Title":"Northeast","ParentId":1,"Subs":[]},{"Id":9,"Title":"Central","ParentId":1,"Subs":[]},{"Id":10,"Title":"Southwest","ParentId":1,"Subs":[]},{"Id":18,"Title":"Southeast","ParentId":1,"Subs":[]}]},{"Id":2,"Title":"Canada","ParentId":null,"Subs":[]},{"Id":3,"Title":"France","ParentId":null,"Subs":[]},{"Id":4,"Title":"Germany","ParentId":null,"Subs":[]},{"Id":5,"Title":"Australia","ParentId":null,"Subs":[]},{"Id":6,"Title":"United Kingdom","ParentId":null,"Subs":[]}]

const result = removeEmpty(tree, 'Subs');

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

【讨论】:

    【解决方案2】:

    正确答案是这样的:

    let array = 	[
    		{
    			'Id': 1,
    			'Title': 'United States',
    			'ParentId': null,
    			'Subs': [
    				{
    					'Id': 7,
    					'Title': 'Northwest',
    					'ParentId': 1,
    					'Subs': []
    				},
    				{
    					'Id': 8,
    					'Title': 'Northeast',
    					'ParentId': 1,
    					'Subs': []
    				},
    				{
    					'Id': 9,
    					'Title': 'Central',
    					'ParentId': 1,
    					'Subs': []
    				},
    				{
    					'Id': 10,
    					'Title': 'Southwest',
    					'ParentId': 1,
    					'Subs': []
    				},
    				{
    					'Id': 18,
    					'Title': 'Southeast',
    					'ParentId': 1,
    					'Subs': []
    				}
    			]
    		},
    		{
    			'Id': 2,
    			'Title': 'Canada',
    			'ParentId': null,
    			'Subs': []
    		},
    		{
    			'Id': 3,
    			'Title': 'France',
    			'ParentId': null,
    			'Subs': []
    		},
    		{
    			'Id': 4,
    			'Title': 'Germany',
    			'ParentId': null,
    			'Subs': []
    		},
    		{
    			'Id': 5,
    			'Title': 'Australia',
    			'ParentId': null,
    			'Subs': []
    		},
    		{
    			'Id': 6,
    			'Title': 'United Kingdom',
    			'ParentId': null,
    			'Subs': []
    		}
    	]
    let newArray = array.map(item=> {
    	if (item.Subs.length===0){
    		delete item.Subs
    		return item
    	}
    	item.Subs = item.Subs.map(item=>{
    		if (item.Subs.length===0){
    			delete item.Subs
    			return item
    		}
    	})
    	return item
    }
    )
    console.log(newArray)

    【讨论】:

      【解决方案3】:

      let data = [
                {
                  "Id": 1,
                  "Title": "United States",
                  "ParentId": null,
                  "Subs": [
                    {
                      "Id": 7,
                      "Title": "Northwest",
                      "ParentId": 1,
                      "Subs": []
                    },
                    {
                      "Id": 8,
                      "Title": "Northeast",
                      "ParentId": 1,
                      "Subs": []
                    },
                    {
                      "Id": 9,
                      "Title": "Central",
                      "ParentId": 1,
                      "Subs": []
                    },
                    {
                      "Id": 10,
                      "Title": "Southwest",
                      "ParentId": 1,
                      "Subs": []
                    },
                    {
                      "Id": 18,
                      "Title": "Southeast",
                      "ParentId": 1,
                      "Subs": []
                    }
                  ]
                },
                {
                  "Id": 2,
                  "Title": "Canada",
                  "ParentId": null,
                  "Subs": []
                },
                {
                  "Id": 3,
                  "Title": "France",
                  "ParentId": null,
                  "Subs": []
                },
                {
                  "Id": 4,
                  "Title": "Germany",
                  "ParentId": null,
                  "Subs": []
                },
                {
                  "Id": 5,
                  "Title": "Australia",
                  "ParentId": null,
                  "Subs": []
                },
                {
                  "Id": 6,
                  "Title": "United Kingdom",
                  "ParentId": null,
                  "Subs": []
                }
              ];
      
      data = data.map(row=>{
        if (!row.Subs.length) {
           let {Subs,...r} = row;
           return r;
        } return row
      })
      
      console.log(data);

      【讨论】:

        【解决方案4】:

        编写两个函数并将遍历数组的函数传递给数据的映射函数,如下所示

        function formatData(val) {
          if (val.Subs.length > 0) val.Subs.map(a => a.Subs.length > 0 ? formatData(a.Subs) : deleteSubs(a));
          else deleteSubs(val);
          return val;
        }
        
        function deleteSubs(val) {
          delete val.Subs;
        }
        
        var data = [{
            "Id": 1,
            "Title": "United States",
            "ParentId": null,
            "Subs": [{
                "Id": 7,
                "Title": "Northwest",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 8,
                "Title": "Northeast",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 9,
                "Title": "Central",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 10,
                "Title": "Southwest",
                "ParentId": 1,
                "Subs": []
              },
              {
                "Id": 18,
                "Title": "Southeast",
                "ParentId": 1,
                "Subs": []
              }
            ]
          },
          {
            "Id": 2,
            "Title": "Canada",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 3,
            "Title": "France",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 4,
            "Title": "Germany",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 5,
            "Title": "Australia",
            "ParentId": null,
            "Subs": []
          },
          {
            "Id": 6,
            "Title": "United Kingdom",
            "ParentId": null,
            "Subs": []
          }
        ]
        console.log(data.map(formatData))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-15
          • 1970-01-01
          • 2013-04-25
          • 2019-04-25
          相关资源
          最近更新 更多