我在陣列和物件中有兩個變數,需要從允許的欄位中洗掉不匹配的欄位。這是陣列和物件變數。
實際上,我的要求是需要創建僅包含回應資料中允許欄位的單獨物件。請提出解決方案。
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,
},
},
};
uj5u.com熱心網友回復:
回圈遍歷
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;
}
actualDataObj = actualDataObj?.[k];
if (i === pathArr.length - 1) {
resultantObj[k] = actualDataObj;
} else if (resultantObj[k] === undefined) {
resultantObj[k] = {};
toDetach = { object: resultantObj, key: k };
}
resultantObj = resultantObj[k];
}
});
return resData;
}
console.log(filterData(data, allowedPaths));
注意:上述解決方案還嘗試處理allowedPaths陣列中存在無效路徑的情況。以下是一些無效路徑:
- “ID”
- “payload.offer.application_id.value”:
toDetach上述解決方案中的變數用于處理這些型別的情況。 - “foo.bar.baz”
相關檔案:
- String.prototype.split
- Object.prototype.hasOwnProperty
- Array.prototype.forEach
- 可選鏈接 (?)
- 洗掉運算子
uj5u.com熱心網友回復:
你能試試這個。
function CheckKey(obj, keyVal, allowedFields) {
Object.keys(obj).forEach(function (key) {
let keyValInternal = keyVal.length === 0 ? key : keyVal '.' key;
if (typeof obj[key] === 'object') {
return CheckKey(obj[key], keyValInternal, allowedFields);
} else {
if (allowedFields.indexOf(keyValInternal) < 0){
delete obj[key];
}
}
});
}
我在一組簡單的資料上運行它(下面的示例),它去掉了“b”引數
let x = {t: {a:1, b:2}, s: 3}
let allowedFields = [
"t.a"
];
CheckKey(x, '', allowedFields);
console.log(x)
輸出
{
"t": {
"a": 1
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/481413.html
標籤:javascript
下一篇:呼叫函式角度時更改引數的值
