2017-07-25 58 views
0

我正在使用angular 2与数据表来修改大型数据集。修改后,我需要使用弹簧将更改保存在数据库中。从json或对象中删除空条目

这是我发送给服务器的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":{ } 
     } 
    } 
    } 
} 

正如你可以看到有一些空entrie在此JSON

是否有将它们发送到服务器,或者让他们不会在对象映射之前删除这些entrie的解决方案。

+0

此问题与角度无关。这是一个JS/TS问题。 – echonax

回答

2

我改编自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
  • 空字符串''
  • 空对象{}

空ARR AY:[]

所以

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

将变得

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

谢谢,但它没有奏效我认为这是因为实际上有一个对象没有任何属性。所以当我将这个对象串起来时,我只能得到空的大括号。 当我用我的浏览器调试它说,有一个对象,但它没有任何属性。 –

+0

我应该在对象上还是在json上使用此功能 –

+0

我已经更新了答案 - 您是否获得了我最近的编辑?不幸的是,原来不包括删除空物体抱歉!在对象上使用它之前,对它进行字符串处理 – 0mpurdy

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)

提供结构
+0

对于具体问题+1,这是一个很好的答案,但是我会离开我的,因为它应该为其他类似问题的其他人解决问题。 – 0mpurdy

0

谢谢大家我设法纠正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; 
    }; 

非常感谢你marzelin。