我需要一些帮助来按键过滤对象属性,但将白名单中过滤的键保持为空。
我在 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 所指出的,请注意我们使用的条件,它不会删除具有null
、false
或 等值的键0
。如果您还想删除所有这些类型的值,请使用 under given 条件。
filtered[key] = raw[key] ? {} : raw[key];
关于javascript - 按键过滤对象属性,但将白名单中过滤的键保留为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45883753/