javascript - 从 typescript 对象中查找具有填充值的属性名称

标签 javascript json typescript object

我有属性名称数组 (removableWriteOffFields),我需要检查 JSON 对象中的这些属性是否已填充值。之后,我需要将填充属性列表写入filledFields变量。我尝试将对象转换为值及其属性名称的数组,但该对象是结构化的,因此我无法轻松地将其转换为我将检查的数组。

我尝试过这个解决方案

    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;
        }

最佳答案

这是一个使用递归的更简单的解决方案。

const pick = (obj, arr, def={}) => {
  let val = def;
  Object.keys(obj).forEach((item, curr) => {
    if(arr.includes(item)) {
      val[item] = obj[item];
    } else if(typeof obj[item] === 'object') {
      pick(obj[item], arr, val)
    }
  });
  return val
}

let arr = [
  "flowerSelfAssessment",
  "phoneNumber",
  "gender",
  "birthDate",
  "age",
  "jobTitle",
  "jobFamily",
  "city",
  "region",
  "country",
  "parentOrganizationName"
    ]
    
let obj = {
  "_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...",
}

const pick = (obj, arr, def={}) => {
	let val = def;
  Object.keys(obj).forEach((item, curr) => {
  	if(arr.includes(item)) {
    	val[item] = obj[item];
    } else if(typeof obj[item] === 'object') {
    	pick(obj[item], arr, val)
    }
  });
  return val
}

console.log(pick(obj, arr))

typescript 版本(我删除了:let key: keyof IndividualParty;并更改了let key = item as (keyof IndividualParty));并且对我来说工作正常,函数返回带有属性的数组

function pick(party: IndividualParty,removFields: (keyof IndividualParty)[], def?: string[]) {
  let val: string[];
  if (def !== undefined) {
      val = def;
  } else {
      val = [];
  }
  Object.keys(party).forEach(item => {
    let key = item as (keyof IndividualParty);
    if (removFields.includes(key)) {
       val.push(key);
     } else if (typeof party[key] === 'object') {
        pick(party[key], removFields, val);
      }
    });
    return val;
 }
 pick(obj, arr)

关于javascript - 从 typescript 对象中查找具有填充值的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57198269/

相关文章:

javascript - 当突出显示/选择文本中的单词时执行操作

javascript - 将 JSON 对象从 Angular 服务传递给指令

java - 通过改造在 POST 请求中发送 JSON

javascript - 如何在 Angular 应用程序中调用 APP_INITIALIZER

angular - 更新 Angular 后,我们得到一个 "process is not defined"

javascript - Javascript 中的图像淡入和淡出动画(不是 JQuery)

javascript - 添加NVD3图表的选择框

javascript - 如何将变量发送到JavaScript?

java - 如何在 Java 中使用 FlexJson Json 序列化器从 json 字符串获取 List<Long>?

jquery - 如何解决错误 "jQuery is not defined"?