【问题标题】:Removing empty entry from json or object从 json 或对象中删除空条目
【发布时间】:2017-07-26 03:05:57
【问题描述】:

我正在使用带有数据表的 angular 2 来修改大型数据集。修改后,我需要使用弹簧将更改保存在我的数据库中。

这是我发送到服务器的 json。

{  
  "id":3,
  "mois":"2017-07-01",
  "status":"Soumise",
  "ligneNoteDeFrais":{  
    "2017-07-10":{  
      "id":1,
      "day":"2017-07-10",
      "fk":{  
        "id":2,
        "description":"frais kilomtrique",
        "nb":5,
        "pu":6,
        "totale":44,
          "typeNoteDeFrais":null
        },
        "preuves":[],
        "detailFrais":{  
          "12":{  
            "id":1,
            "description":"test",
            "nb":5,
            "pu":4,
            "totale":0,
            "typeNoteDeFrais":{  
            "id":12,
            "intitule":"gg",
            "justifiable":true,
            "justificationObligatoire":true,
            "quantifiable":true,
            "new":false
          }
        },
        "14":{ },
        "15":{ },
        "18":{ },
        "19":{ }
      }
    },
    "2017-07-01":{  
      "fk":{ },
      "detailFrais":{  
        "12":{ },
        "14":{ },
        "15":{ },
        "18":{ },
        "19":{ }
      }
    },
    "2017-07-02":{  
      "fk":{ },
      "detailFrais":{  
        "12":{ },
        "14":{ },
        "15":{ },
        "18":{ },
        "19":{ }
      }
    }
  }
}

如您所见,此 JSON 中有一些空条目

是否有解决方案可以在将这些条目发送到服务器之前删除它们,或者使它们不映射到对象中。

【问题讨论】:

  • 这个问题与角度无关。这是一个 js/ts 问题。

标签: javascript typescript


【解决方案1】:

我从 this stack overflow question's answers 改编了这个,但因为它现在是打字稿,我认为它已经足够不同了。

function removeEmpty(obj) {
  Object.keys(obj).forEach((key) => {
    if (obj[key] && typeof obj[key] === 'object') {
      const childObject = removeEmpty(obj[key]);
      if (childObject === undefined) {
        delete obj[key];
      }
    } else if (obj[key] === '' || obj[key] === null || obj[key] === undefined) {
      delete obj[key];
    }
  });
  return Object.keys(obj).length > 0 || obj instanceof Array ? obj : undefined;
};

let json = {
  "id": 3,
  "mois": "2017-07-01",
  "status": "Soumise",
  "ligneNoteDeFrais": {
    "2017-07-10": {
      "id": 1,
      "day": "2017-07-10",
      "fk": {
        "id": 2,
        "description": "frais kilomtrique",
        "nb": 5,
        "pu": 6,
        "totale": 44,
        "typeNoteDeFrais": null
      },
      "preuves": [],
      "detailFrais": {
        "12": {
          "id": 1,
          "description": "test",
          "nb": 5,
          "pu": 4,
          "totale": 0,
          "typeNoteDeFrais": {
            "id": 12,
            "intitule": "gg",
            "justifiable": true,
            "justificationObligatoire": true,
            "quantifiable": true,
            "new": false
          }
        },
        "14": {},
        "15": {},
        "18": {},
        "19": {}
      }
    },
    "2017-07-01": {
      "fk": {},
      "detailFrais": {
        "12": {},
        "14": {},
        "15": {},
        "18": {},
        "19": {}
      }
    },
    "2017-07-02": {
      "fk": {},
      "detailFrais": {
        "12": {},
        "14": {},
        "15": {},
        "18": {},
        "19": {}
      }
    }
  }
}

console.log(removeEmpty(json));

我在一个服务里面有这个,我在需要这个功能的地方注入它。

请注意,这将删除以下任何键:

  • undefined
  • null
  • 空字符串''
  • 空对象{}

不是空数组:[]

所以

{ field: 'data', field2: {}, field3: undefined, field4: null, field5: '', field6: 6, field7: [] }

会变成

{ field: 'data', field6: 6, field7: [] }

【讨论】:

  • 谢谢,但它不起作用我认为因为实际上有一个对象没有任何属性。所以当我对这个对象进行字符串化时,我只会得到空括号。当我用浏览器调试时,它说有一个对象,但它没有任何属性。
  • 我应该在对象上还是在json上使用这个函数
  • 我已经更新了答案 - 你得到我最近的编辑了吗?不幸的是,原版不包括删除空对象对不起!在字符串化之前在对象上使用它
  • 我尝试了最近的一个,现在它删除了“ligneNoteDeFrais”对象,即使它不是空的。我已经在上面的例子中尝试过了,它已经删除了孔对象。现在我只得到 "id":3, "mois":"2017-07-01", "status":"Soumise",
  • 这个函数读起来太费劲了;你应该分开那个条件而不是滥用&&||短路。
【解决方案2】:

此解决方案专门针对问题中提供的对象结构设计

function isEmptyObject(obj) {
  return !Boolean(Object.keys(obj).length)
}

function removeEmpty(data) {
  for (let noteKey in data.ligneNoteDeFrais) {
    const note = data.ligneNoteDeFrais[noteKey]
    if (isEmptyObject(note.fk)) {
      delete note.fk
    }
    for (let detail in note.detailFrais) {
      if (isEmptyObject(note.detailFrais[detail])) {
        delete note.detailFrais[detail]
      }
    }
    if (isEmptyObject(note.detailFrais)) {
      delete note.detailFrais
    }
    if (isEmptyObject(note)) {
      delete data.ligneNoteDeFrais[noteKey]
    }
  }
}

const data = {
  "id": 3,
  "mois": "2017-07-01",
  "status": "Soumise",
  "ligneNoteDeFrais": {
    "2017-07-10": {
      "id": 1,
      "day": "2017-07-10",
      "fk": {
        "id": 2,
        "description": "frais kilomtrique",
        "nb": 5,
        "pu": 6,
        "totale": 44,
        "typeNoteDeFrais": null
      },
      "preuves": [

      ],
      "detailFrais": {
        "12": {
          "id": 1,
          "description": "test",
          "nb": 5,
          "pu": 4,
          "totale": 0,
          "typeNoteDeFrais": {
            "id": 12,
            "intitule": "gg",
            "justifiable": true,
            "justificationObligatoire": true,
            "quantifiable": true,
            "new": false
          }
        },
        "14": {

        },
        "15": {

        },
        "18": {

        },
        "19": {

        }
      }
    },
    "2017-07-01": {
      "fk": {

      },
      "detailFrais": {
        "12": {

        },
        "14": {

        },
        "15": {

        },
        "18": {

        },
        "19": {

        }
      }
    },
    "2017-07-02": {
      "fk": {

      },
      "detailFrais": {
        "12": {

        },
        "14": {

        },
        "15": {

        },
        "18": {

        },
        "19": {

        }
      }
    }

  }
}


removeEmpty(data)
console.log(data)

【讨论】:

  • 这是对特定问题 +1 的一个很好的回答,但是我要离开我的,因为它应该可以为其他有类似问题的人解决问题。
【解决方案3】:

谢谢你们,我设法纠正了 0mpurdy 提出的解决方案。

removeEmpty(obj) {
        Object.keys(obj).forEach((key) => {
            (obj[key] && typeof obj[key] === 'object') && (obj[key]=this.removeEmpty(obj[key]));
            (obj[key] === '' || obj[key] === null || obj[key] === undefined) && delete obj[key];
        });
        return Object.keys(obj).length > 0 ? obj : undefined;
    };

也谢谢你。

【讨论】:

  • 这拯救了我的一天!!
猜你喜欢
  • 1970-01-01
  • 2018-10-15
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多