我在数组和对象中有两个变量,需要从允许的字段中删除不匹配的字段。这是数组和对象变量。
实际上,我的要求是需要创建仅包含响应数据中允许字段的单独对象。请提出解决方案。
let allowedFields = [
"organization_id",
"organization_name",
"payload.offer.application_id",
"payload.offer.user_id",
"id",
"candidate_id",
];
这是对象值如下
let data = {
organization_id: 4002400004,
organization_name: "Velocity Global Integration Sandbox",
action: "offer_updated",
payload: {
offer: {
id: 4524843004,
application_id: 31948577004,
user_id: 4123647004,
version: 1,
sent_on: null,
resolved_at: "2022-05-19T06:21:25.084Z",
start_date: "2022-05-17",
notes: null,
job_id: 4298940004,
offer_status: "Accepted",
},
resume: {
name: "manikandan",
},
},
};
数据对象只有 allowedFields 数组中存在的字段,期望输出如下
let output = {
organization_id: 4002400004,
organization_name: "Velocity Global Integration Sandbox",
payload: {
offer: {
application_id: 31948577004,
user_id: 4123647004,
},
},
};
循环遍历allowedPaths
数组中的所有路径。
拆分路径.
以获得键数组。
然后遍历键数组,并为每个键resData
使用实际对象填充data
对象。
const
allowedPaths = ["organization_id","organization_name","payload.offer.application_id","payload.offer.user_id","id","candidate_id"],
data = {organization_id:4002400004,organization_name:"Velocity Global Integration Sandbox",action:"offer_updated",payload:{offer:{id:4524843004,application_id:31948577004,user_id:4123647004,version:1,sent_on:null,resolved_at:"2022-05-19T06:21:25.084Z",start_date:"2022-05-17",notes:null,job_id:4298940004,offer_status:"Accepted"},resume:{name:"manikandan"}}};
function filterData(data, allowedPaths) {
const resData = {};
allowedPaths.forEach((path) => {
const pathArr = path.split(".");
let actualDataObj = data;
let resultantObj = resData;
let toDetach;
for (let i = 0; i < pathArr.length; i++) {
const k = pathArr[i];
if (!actualDataObj?.hasOwnProperty(k)) {
if (toDetach) {
delete toDetach.object[toDetach.key];
}
return;
}
if (i === pathArr.length - 1) {
resultantObj[k] = actualDataObj[k];
} else if (!resultantObj.hasOwnProperty(k)) {
resultantObj[k] = {};
if (!toDetach) {
toDetach = { object: resultantObj, key: k };
}
}
resultantObj = resultantObj[k];
actualDataObj = actualDataObj[k];
}
});
return resData;
}
console.log(filterData(data, allowedPaths));
您还可以递归循环对象中的所有属性data
并创建具有允许属性的对象。
const
allowedPaths = ["organization_id","organization_name","payload.offer.application_id","payload.offer.user_id","id","candidate_id"],
data = {organization_id:4002400004,organization_name:"Velocity Global Integration Sandbox",action:"offer_updated",payload:{offer:{id:4524843004,application_id:31948577004,user_id:4123647004,version:1,sent_on:null,resolved_at:"2022-05-19T06:21:25.084Z",start_date:"2022-05-17",notes:null,job_id:4298940004,offer_status:"Accepted"},resume:{name:"manikandan"}}};
function filterData(data, allowedPaths, parentPath = "") {
return Object.entries(data).reduce((o, [k, v]) => {
const path = `${parentPath ? parentPath + "." : ""}${k}`;
if (allowedPaths.has(path)) {
return { ...o, [k]: v };
}
if (v && typeof v === "object") {
const subObj = filterData(v, allowedPaths, path);
if (Object.keys(subObj).length) {
return { ...o, [k]: subObj };
}
}
return o;
}, {});
}
console.log(filterData(data, new Set(allowedPaths)));
注意:allowedPaths
上述两种解决方案还可以处理数组中存在无效路径的情况。以下是一些无效路径:
相关文件:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句