Для справки. Используя Postman (инструмент API REST), мы сравниваем XML с шаблоном, конвертируя XML в JSON, и сравниваем их как объекты Javascript.Сравнение может обрабатывать подстановочные знаки в значениях и будет возвращать новый объект JS (или JSON) только с различиями.Когда нет различий, я получаю пустой объект, который находится в правильном состоянии.В некоторых случаях возвращаются пустые значения или объекты, и мы удаляем их из объекта чистым шагом.
Так выглядит функция очистки :
Utils = {
clean: function(object) {
Object
.entries(object)
.forEach(([k, v]) => {
if (v && typeof v === 'object')
Utils.clean(v);
if (v && typeof v === 'object' && !Object.keys(v).length || v === null || v === undefined)
Array.isArray(object) ? object.splice(k, 1) : delete object[k];
});
return object;
}
}
Это работает нормально для большинства случаев, за исключением случаев, когда у нас есть массив с несколькими одинаковыми пустыми объектами из-за object.splice
в сочетании с foreach
, как указано здесь .
Обычно, Я хотел бы использовать функцию фильтра, использовать _.pickBy
из lodash или итерировать в обратном направлении через массив, но из-за расположения функции clean
я не могу понять, как это сделать.
МожетВы помогаете мне указать, что мне нужно сделать, чтобы правильно удалить несколько пустых элементов и объектов из массива.
Реальный тестовый случай:
var x = {"Document":{"CstmrDrctDbtInitn":{"GrpHdr":{},"PmtInf":{"DrctDbtTxInf":[{"PmtId":{}},{"PmtId":{}},{"PmtId":{}},{"PmtId":{}},{"PmtId":{}}]}}}};
console.log(JSON.stringify(Utils.clean(x)));
// returns {"Document":{"CstmrDrctDbtInitn":{"PmtInf":{"DrctDbtTxInf":[{},{}]}}}}
// desired result: {}
Другие тестовые случаи:
console.log(JSON.stringify(Utils.clean({"a": [null,null,"b","c",{},{},{},{}]})));
// returns {"a":[null,"c",{},{},{}]}
// desired: {"a":["b", "c"]}
console.log(JSON.stringify(Utils.clean({"a": [null,null,"b","c",{"d": {}},{}]})));
// returns {"a":[null,"c",{},{}]}
// desired: {"a":["b", "c"]}
console.log(JSON.stringify(Utils.clean({ "a" : [null,null,{"d": {}, "e": [null, {}]},{}]})));
// returns {"a":[null,{}]}
// desired: {}