javascript - 按键过滤对象属性,但将白名单中过滤的键保留为空

标签 javascript node.js

我需要一些帮助来按键过滤对象属性,但将白名单中过滤的键保持为空。

我在 SO 上使用这个答案中的函数:

https://stackoverflow.com/a/38750895/5397658

预览:

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const allowed = ['item1', 'item3'];

const filtered = Object.keys(raw)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = raw[key];
    return obj;
  }, {});

console.log(filtered);

在我的场景中,我将其作为白名单:

var whitelist = ["ApartmentNumber", "FloorSpace", "PrimaryRoomSpace", "CaseStatusType", "AskingPrice"];

这是原始对象:

{
    "Id": 668,
    "ProjectId": 667,
    "NumberOfBedrooms": 2,
    "FloorSpace": 60,
    "PrimaryRoomSpace": 60,
    "LandLotType": "None",
    "ApartmentNumber": "L-101\r",
    "PublicationTitle": "L-101",
    "PublicationInformationId": 49,
    "CaseStatusId": 227,
    "CaseStatusType": "Ready",
    "CaseStatusName": "Salgsklar",
    "CaseReferralKey": "80-17-10001",
    "AskingPrice": 10000000,
    "EnergyLabel": "None",
    "HeatingGrade": "None",
    "Comission": 0,
    "DocumentCostBasis": 10000000,
    "PricePerSquareMeter": 166666.66666666666666666667,
    "Street": "Street 1",
    "ZipCode": "0682",
    "BuyerIds": [],
    "ResponsibleBrokerId": 0,
    "BrokerId": 0
},
{
    "Id": 669,
    "ProjectId": 667,
    "NumberOfBedrooms": 2,
    "NumberOfBedroomsMax": 2,
    "FloorSpace": 0,
    "FloorSpaceMax": 100,
    "PrimaryRoomSpace": 90,
    "PrimaryRoomSpaceMax": 90,
    "ApartmentNumber": "L-107\r",
    "CaseStatusId": 207,
    "CaseStatusType": "Active",
    "CaseStatusName": "Oppdrag akseptert",
    "CaseReferralKey": "80-17-10007",
    "StoreyOf": 1,
    "EnergyLabel": "None",
    "HeatingGrade": "None",
    "Comission": 0,
    "DocumentCostBasis": 0,
    "Street": "Street 2",
    "ZipCode": "0682",
    "BuyerIds": [],
    "ResponsibleBrokerId": 0,
    "BrokerId": 0
},
{
    "Id": 670,
    "ProjectId": 667,
    "NumberOfBedrooms": 2,
    "NumberOfBedroomsMax": 2,
    "FloorSpace": 0,
    "FloorSpaceMax": 100,
    "PrimaryRoomSpace": 90,
    "PrimaryRoomSpaceMax": 90,
    "ApartmentNumber": "L-106\r",
    "CaseStatusId": 223,
    "CaseStatusType": "General",
    "CaseStatusName": "Bestilt info",
    "CaseReferralKey": "80-17-10006",
    "StoreyOf": 1,
    "EnergyLabel": "None",
    "HeatingGrade": "None",
    "Comission": 0,
    "DocumentCostBasis": 0,
    "Street": "Street 1",
    "ZipCode": "0682",
    "BuyerIds": [],
    "ResponsibleBrokerId": 0,
    "BrokerId": 0
},
{
    "Id": 671,
    "ProjectId": 667,
    "NumberOfBedroomsMax": 1,
    "FloorSpace": 0,
    "FloorSpaceMax": 50,
    "ApartmentNumber": "L-102\r",
    "CaseStatusId": 219,
    "CaseStatusType": "General",
    "CaseStatusName": "All info mottatt",
    "CaseReferralKey": "80-17-10002",
    "StoreyOf": 2,
    "EnergyLabel": "None",
    "HeatingGrade": "None",
    "Comission": 0,
    "DocumentCostBasis": 0,
    "PricePerSquareMeter": 0,
    "Street": "Street 1",
    "ZipCode": "0682",
    "BuyerIds": [],
    "ResponsibleBrokerId": 0,
    "BrokerId": 0
}

这是第一个对象的过滤器函数的输出,它对我有用,因为它具有当前白名单中的所有值:

{ ApartmentNumber: 'L-101\r',
  FloorSpace: 60,
  PrimaryRoomSpace: 60,
  CaseStatusType: 'Ready',
  AskingPrice: 10000000 }

但是对于第二个对象,它看起来像这样。它缺少 AskingPrice,因为它不存在于第二个对象中:

{ ApartmentNumber: 'L-107\r',
  FloorSpace: 0,
  PrimaryRoomSpace: 90,
  CaseStatusType: 'Active' }

问题是我需要白名单中存在的过滤 key ,它们无法删除。如果原始对象中不存在,我希望它们为空。

为了澄清,我需要第二个对象看起来像这样:

{ ApartmentNumber: 'L-107\r',
  FloorSpace: 0,
  PrimaryRoomSpace: 90,
  CaseStatusType: 'Active',
  AskingPrice: ''} //<-- empty string

如何调整过滤函数来做到这一点?

最佳答案

由于您需要在filtered 对象中使用所有允许的键,因此您可以遍历allowed 数组并检查白名单键存在于您的 raw object 中,如果不存在 null 或所需值,只需添加键。示例代码如下。

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
};

const allowed = ['item1', 'item3'];

let filtered = {}

allowed.forEach( key => {
  filtered[key] = (typeof raw[key] === 'undefined') ? '' : raw[key];
})

console.log(filtered);

正如@GrégoryNEUT 所指出的,请注意我们使用的条件,它不会删除具有nullfalse 等值的键0。如果您还想删除所有这些类型的值,请使用 under given 条件。

filtered[key] = raw[key] ? {} : raw[key];

关于javascript - 按键过滤对象属性,但将白名单中过滤的键保留为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45883753/

相关文章:

javascript - 有没有办法从后面调用 .jsp 中的函数?

javascript - Angular 双花括号内的函数调用

javascript - slim 的包应该是依赖项还是 devDependency?

node.js - Openshift - 503 服务在我访问应用程序时暂时不可用

javascript - 使用 Node 签署 AWS API Gateway 请求

javascript - 适合移动设备的 iframe CSS

javascript - 外部样式表不会覆盖 Bootstrap

node.js - 如何将图片上传到本地S3存储桶并自动生成缩略图?

javascript - Node JS Loopback 模型用例

javascript - 如何在 Angular JS 中为 Morris JS 图创建指令