我需要一些帮助来按键过滤对象属性,但是将过滤后的密钥从白名单中保留为空。
我在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' }
问题是我需要白名单中存在的过滤后的密钥,它们无法删除。如果不存在于原始对象中,我希望它们为空。
为了澄清,我需要第二个对象看起来像这样:
{ ApartmentNumber: 'L-107\r',
FloorSpace: 0,
PrimaryRoomSpace: 90,
CaseStatusType: 'Active',
AskingPrice: ''} //<-- empty string
如何调整滤镜功能来执行此操作?
答案 0 :(得分:3)
由于您需要filtered
对象中的所有允许密钥,因此您可以遍历allowed
数组并检查whitelist key
中是否存在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
等值的键。如果您还要删除所有这些类型的值,请使用给定的条件。
filtered[key] = raw[key] ? {} : raw[key];
答案 1 :(得分:0)
这应该可以解决问题。使用Array.prototype.reduce
。
const raw = [{
"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
}
]
const whitelist = ["ApartmentNumber", "FloorSpace", "PrimaryRoomSpace", "CaseStatusType", "AskingPrice"];
raw.forEach(obj => {
const filtered = whitelist.reduce((acc, key) => {
if(key in obj) {
acc[key] = obj[key]
} else {
acc[key] = null
}
return acc
}, {})
console.log(filtered);
})
&#13;
答案 2 :(得分:0)
你可以采用更简单的方式。
var input = [
{
"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
}
];
var whitelist = [
"ApartmentNumber",
"FloorSpace",
"PrimaryRoomSpace",
"CaseStatusType",
"AskingPrice"
];
var output = input.map((item) => {
var out = {};
whitelist.forEach((key) => {
out[key] = key in item ? item[key] : '';
});
return out;
});
console.log(output);
&#13;
答案 3 :(得分:0)
而不是通过Object.keys(raw)
循环遍历allowed
键,这样您就可以确保保留所有允许的属性。
const filtered = {}
allowed.forEach((key) => {
filtered[key] = (typeof raw[key] !== 'undefined') ? raw[key] : '';
});
<强>演示:强>
const raw = {
item1: {
key: 'sdfd',
value: 'sdfd'
},
item2: {
key: 'sdfd',
value: 'sdfd'
},
item3: {
key: 'sdfd',
value: 'sdfd'
}
};
const allowed = ['item1', 'item3', 'item4'];
const filtered = {}
allowed.forEach((key) => {
filtered[key] = (typeof raw[key] !== 'undefined') ? raw[key] : '';
});
console.log(filtered);
&#13;