如何从 TypeScript 中的 JSON 对象数组中删除多个项目

问题描述

我有一个 JSON 对象,我想从中删除一系列项目:

const addressNonrequired = ["addr_linkid_usr","addr_created","addr_updated"]

我知道我可以使用 'delete' 方法,但是我将如何使用上面的数组来做同样的事情:

// remove non-required data
addressesFound.forEach(row => (
  // delete row.addr_linkid_usr,// delete row.addr_created,// delete row.addr_updated
  addressNonrequired.forEach(item => (
    delete row[item];
  ));
));

我已经尝试了几种方法来让它发挥作用,但不确定我是否以正确的方式看待它......?

提供的数组示例:

[
  {
    "addr_id": "41d86d46-8b19-4f4e-be03-f9915ef4947b","addr_type": "postal","addr_linkid_usr": "user1","addr_created": "2021-03-10","addr_updated": "","addr_active": true,"addr_postal_as_residential": false,"addr_international": false,"addr_autocomplete_id": null
  },{
    "addr_id": "b18c2ca6-29cf-4114-9067-b37fd3394638","addr_type": "residential","addr_postal_as_residential": true,"addr_international": true,"addr_autocomplete_id": "string"
  }
]

预期输出

[
  {
    "addr_id": "41d86d46-8b19-4f4e-be03-f9915ef4947b","addr_autocomplete_id": "string"
  }
]

解决方法

您必须遍历 addressesFound 数组,并在每个对象中遍历该对象的键,比较 addressNonRequired 数组中是否存在该键并将其删除(如果适用)。

var addressesFound = [{
    "addr_id": "41d86d46-8b19-4f4e-be03-f9915ef4947b","addr_type": "postal","addr_linkid_usr": "user1","addr_created": "2021-03-10","addr_updated": "","addr_active": true,"addr_postal_as_residential": false,"addr_international": false,"addr_autocomplete_id": null
  },{
    "addr_id": "b18c2ca6-29cf-4114-9067-b37fd3394638","addr_type": "residential","addr_postal_as_residential": true,"addr_international": true,"addr_autocomplete_id": "string"
  }
];

const addressNonRequired = ["addr_linkid_usr","addr_created","addr_updated"];

var updatedAddresses = addressesFound.map(function(address) {
    Object.keys(address).forEach(function(key) { // For each address object,iterate over the keys
    if (addressNonRequired.includes(key)) {
      delete address[key]; // Check if the key is present in the addressNonRequired array. Delete if present
    }
  });
  return address;
});

console.log(updatedAddresses);

,

在过滤对象或对象数组时,我总是经常使用它。

我通常在我的 helpers.ts 文件中有这些。他们还确保您要过滤的键确实存在于对象中,并且它还具有自动完成功能。

export function except<T,K extends keyof T>(data: T,keys: Array<K>) {
    const copy = { ...data };
    for (const key of keys) {
        if (key in copy) {
            delete copy[key];
        }
    }
    return copy;
}

export function exceptMany<T,K extends keyof T>(data: Array<T>,keys: Array<K>) {
    return [...data].map((item) => except(item,keys));
}

然后为了过滤一个对象数组,我们这样做:

const data = [
  {
    "addr_id": "41d86d46-8b19-4f4e-be03-f9915ef4947b","addr_autocomplete_id": "string"
  }
];

const results = exceptMany(data,['addr_linkid_usr','addr_created','addr_updated']);

也可以仅从一个对象中过滤键:

const single = {
    "addr_id": "41d86d46-8b19-4f4e-be03-f9915ef4947b","addr_autocomplete_id": null
};

const filteredSingle = except(single,'addr_updated']);