按键过滤对象属性,但将过滤后的键从白名单保留为空

时间:2017-08-25 14:33:21

标签: 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' }

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

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

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

如何调整滤镜功能来执行此操作?

4 个答案:

答案 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指出的那样,请注意我们正在使用的条件,它不会删除具有nullfalse0等值的键。如果您还要删除所有这些类型的值,请使用给定的条件。

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

答案 1 :(得分:0)

这应该可以解决问题。使用Array.prototype.reduce

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

你可以采用更简单的方式。

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

而不是通过Object.keys(raw)循环遍历allowed键,这样您就可以确保保留所有允许的属性。

const filtered = {}

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

<强>演示:

&#13;
&#13;
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;
&#13;
&#13;