从数组中删除空对象,然后如果结果数组为空,则从父对象中删除

时间:2021-06-28 21:10:31

标签: javascript arrays

正如标题所述,我试图从本质上清理一个对象,以准备将其发布到 API。

API 端点不允许空数组。

假设我有一个看起来像这样的 POST 对象 -

rV%((p-1)/rV)==1

我相信我使用这样的东西从数组中清除空对象 -

{
  "Addresses": [
    {}
  ],
  "Phones": [
    {}
  ],
  "FirstName": "Foo",
  "LastName": "Bar",
  "EmailAddress": "foobar@internet.com",
  "Name": "FooBar"
}

这将从数组中删除空对象。但是,这会留下两个空数组。我的想法是最好清除空对象,然后确定这些数组是否为空,如果是,(在我需要帮助的地方)将它们从父对象中删除。

非常感谢有关如何处理此问题或如何更有效地执行此操作的任何帮助。

3 个答案:

答案 0 :(得分:3)

为了使其通用(对于任意嵌套数据结构),您可以使用递归解决方案,以便在清除空对象后有一些级联效果,使包装对象为空,等等。

假设您还想删除 undefined 作为值,然后为任何非原始且没有键的内容返回 undefined,并让调用者删除接收 undefined 值的键.

代码:

function clean(obj) {
    if (Object(obj) !== obj) return obj; // primitives are kept
    obj = Array.isArray(obj)
        ? obj.map(clean).filter(v => v !== undefined)
        : Object.fromEntries(
            Object.entries(obj).map(([k, v]) => [k, clean(v)])
                               .filter(([_, v]) => v !== undefined)
        );
    return Object.keys(obj).length ? obj : undefined;
}

// Demo
let input = {
  "Addresses": [{}],
  "Phones": [{}],
  "FirstName": "Foo",
  "LastName": "Bar",
  "EmailAddress": "foobar@internet.com",
  "Name": "FooBar"
};

console.log(clean(input));

答案 1 :(得分:0)

以下是您要求的吗?

const addrArr = input.addrArr;
const phoneArr = input.phoneArr;
  
const newAddrArray = addrArr.filter(value => Object.keys(value).length !== 0);
const newPhoneArray = phoneArr.filter(value => Object.keys(value).length !== 0);

const r = {};
if (newAddrArray.length > 0) r.Addresses = newAddrArray;
if (newPhoneArray.length > 0) r.Phones = newPhoneArray;

return r;

答案 2 :(得分:-1)

API 不支持空数组似乎很奇怪。无论如何,这绝对可以解决。

const payload = {
  "Addresses": [
    {}
  ],
  "Phones": [
    {}
  ],
  "FirstName": "Foo",
  "LastName": "Bar",
  "EmailAddress": "foobar@internet.com",
  "Name": "FooBar"
};

let cleanedPayload = {
  "FirstName": payload.FirstName,
  "LastName": payload.LastName,
  "EmailAddress": "foobar@internet.com",
  "Name": "FooBar"
};

const isNotEmpty = obj => Object.keys(obj).length !== 0;

const hasPhoneNumbers = payload.Phones.filter(isNotEmpty).length > 0;
const hasAddresses = payload.Addresses.filter(isNotEmpty).length > 0;

if(hasPhoneNumbers) {
  cleanedPayload.Phones = payload.Phones;
}
if(hasAddresses) {
  cleanedPayload.Addresses = payload.Addresses;
}

// pseduo-code
api.post('/my/url', cleanedPayload);

为了稍微清理一下这段代码,您可以使用 https://ramdajs.com/https://lodash.com/ 之类的库,但绝对没有必要。

相关问题