【发布时间】:2019-12-03 12:19:40
【问题描述】:
我有一组属性名称 (removableWriteOffFields),我需要检查 JSON 对象中的这些属性是否具有填充值。之后,我需要将填充属性列表写入填充字段变量。我尝试将对象转换为值数组及其属性名称,但是这个对象是结构化的,所以我不能轻易地将它转换为我要检查的数组。
我试过这个解决方案
let filledFields: string[] = [];
const removFields: string[] = this.individualPartyConfiguration
.removableWriteOffFields;
const partyArr = helper.filter(function(abc) {
return isString(abc[1]);
});
removFields.forEach(element => {
const index = partyArr.findIndex(e => e[0] === element);
if (
partyArr[index][1] !== (undefined && null) &&
partyArr[index][1].length !== 0
) {
filledFields.push(element);
}
});
removableWriteOffFields 包含我需要检查的所有属性名称。
"removableWriteOffFields": [
"flowerSelfAssessment",
"phoneNumber",
"gender",
"birthDate",
"age",
"jobTitle",
"jobFamily",
"city",
"region",
"country",
"parentOrganizationName"
]
对象示例:
{
"_id": "6224da36-9a28-4bed-a316-f910d1c1df90",
"metadata": {
"trackingInfo": {
"initiator": "EntityFactory",
"created": "2019-07-16T08:13:30.044Z",
"creator": "EntityFactory",
"modified": "2019-07-16T08:13:30.044Z",
"version": 0
},
"type": "IndividualParty",
"valid": true
},
"externalPartyId": "P010",
"locations": [
{
"_id": "986b7bbe-6138-4897-8b70-22d89126fc03",
"metadata": {
"trackingInfo": {
"initiator": "EntityFactory",
"created": "2019-07-16T08:13:30.044Z",
"creator": "EntityFactory",
"modified": "2019-07-16T08:13:30.044Z",
"version": 0
},
"type": "EmailAddressLocation",
"valid": true
},
"valid": true,
"primary": true,
"emailAddress": "jan.Kina@luth.com"
}
],
"partyProfiles": [
{
"_id": "877b183a-0610-42d8-9899-3722639d2f89",
"metadata": {
"trackingInfo": {
"initiator": "EntityFactory",
"created": "2019-07-16T08:13:30.044Z",
"creator": "EntityFactory",
"modified": "2019-07-16T08:13:30.044Z",
"version": 0
},
"type": "LutherProUserPartyProfile",
"valid": true
},
"agile": false,
"agileShare": 0,
"parentOrganizationName": "Apo Czech, a.s.",
"background": {
"defaultLink": "https://s3-eu-wea.com/Luideo_1.mp4.png",
"videoLink": "httpseo_1.mp4"
},
"contractStart": "2019-07-16T08:13:30.044Z",
"avatarLink": "",
"nickname": "Jan.Kina",
"jobTitle": "Backend developer",
"preferredLang": "en-US",
"defaultPartyRoleId": "2e71ee52-0f24-88ee-5ec7-8b9f5c1df6a3"
}
],
"partyRoleIds": [
"510d02d1-41a9-c139-f8aa-59c363eb0b2c"
],
"birthDate": "2019-01-15T00:00:00.000Z",
"firstName": "Jan",
"formattedName": "Jan Kina",
"formattedPhoneticName": "Jan Kina",
"gender": "male",
"headline": "headline",
"lastName": "Kina",
"middleNames": [],
"phoneticFirstName": "Jan",
"phoneticLastName": "Kina",
"summary": "Summary of this user..."
}
解决方案
function pick<T>(party: T, removFields: string[], val: string[]) {
let key: keyof T;
Object.keys(party).forEach(item => {
key = item as (keyof T);
if (removFields.includes(key as string)) {
val.push(key as string);
logger.info(`val: ${JSON.stringify(val, undefined, 2)}`);
} else if (typeof party[key] === 'object') {
pick<T[keyof T]>(party[key], removFields, val);
}
});
return val;
}
【问题讨论】:
-
我的迭代器 IIFE 怎么样?在这里用作答案stackoverflow.com/questions/56698728/… - 您可以通过 2 个预定义(深度/广度优先)迭代器迭代您的 JSON 并专注于您的问题;-) 并在此处回购 github.com/eltomjan/ETEhomeTools/blob/master/HTM_HTA/…
-
我编辑了我的答案,我没有更多的想法:)
-
我像泛型函数一样重写它并开始工作。谢谢
标签: javascript json typescript object