[英]Javascript Reduce or Flatten an object?
我有一個正在使用的數據對象是動態的,並且來自數據庫調用。 如果記錄中包含approval
詳細信息,它將包含在我返回的對象中,否則將被省略。
我的問題是我有一個導出方法,該方法可以將對象轉換為excel文件,但這僅使用對象的第一級,因此缺少可能的批准數據。
我試圖找出如何展平或縮小對象,以便將所有鍵/值都帶到父級。
示例代碼:
// Current Data
var obj = [{
"toolSuite": "Enterprise Product",
"toolStatus": "Active",
"toolOwnerGroup": "PD",
"toolTier": "1",
"infoSec": "Yes",
"sso": "?",
"toolPortfolio": "Enterprise Product",
"NeedByDate": "29-Jun-2018",
"approvals": {
"approval": { <--- Need to move all this data to the parent level
"ApprovalID": "139",
"TaskID": "232",
"SubmissionDate": "2018-10-03T22:19:24.153",
"WhoSubmitted": "Q1234",
"Approver": "Q5678",
"IsCanceled": "0",
"ApproverFirst": "Bob",
"ApproverLast": "Builder",
"ApproverNTID": "bbuilder"
}
}
}, {
"toolSuite": "Enterprise Product",
"toolStatus": "Active",
"toolOwnerGroup": "PD",
"toolTier": "1",
"infoSec": "Yes",
"sso": "?",
"toolPortfolio": "Enterprise Product",
"NeedByDate": "29-Jun-2018",
"ApprovalID": "139"
}]
// Desired Output
var obj = [{
"toolSuite": "Enterprise Product",
"toolStatus": "Active",
"toolOwnerGroup": "PD",
"toolTier": "1",
"infoSec": "Yes",
"sso": "?",
"toolPortfolio": "Enterprise Product",
"NeedByDate": "29-Jun-2018",
"ApprovalID": "139",
"TaskID": "232",
"SubmissionDate": "2018-10-03T22:19:24.153",
"WhoSubmitted": "Q1234",
"Approver": "Q5678",
"IsCanceled": "0",
"ApproverFirst": "Bob",
"ApproverLast": "Builder",
"ApproverNTID": "bbuilder"
}, {
"toolSuite": "Enterprise Product",
"toolStatus": "Active",
"toolOwnerGroup": "PD",
"toolTier": "1",
"infoSec": "Yes",
"sso": "?",
"toolPortfolio": "Enterprise Product",
"NeedByDate": "29-Jun-2018",
}]
在上面的代碼中,第一個對象具有approvals.approval
數據。 我正在嘗試將此數據帶到父級。 它不是數據數組,所以不會有重復的鍵。
我目前在我的項目lodash
用於其他項目,但找不到任何可以輕松執行此操作的操作。
對於這種情況,是否需要reduce
或flatten
? 它應該永遠只不過是approvals.approval
但是如果有一種方法,我可以指定深度為3
,並且可以將數據移動到父級,那將是理想的選擇。
我應該采用哪種方法處理對象類型?
不需要庫,只需傳播或Object.assign
approval
對象到父對象,然后刪除approvals
鍵:
var obj=[{"toolSuite":"Enterprise Product","toolStatus":"Active","toolOwnerGroup":"PD","toolTier":"1","infoSec":"Yes","sso":"?","toolPortfolio":"Enterprise Product","NeedByDate":"29-Jun-2018","approvals":{"approval":{"ApprovalID":"139","TaskID":"232","SubmissionDate":"2018-10-03T22:19:24.153","WhoSubmitted":"Q1234","Approver":"Q5678","IsCanceled":"0","ApproverFirst":"Bob","ApproverLast":"Builder","ApproverNTID":"bbuilder"}}},{"toolSuite":"Enterprise Product","toolStatus":"Active","toolOwnerGroup":"PD","toolTier":"1","infoSec":"Yes","sso":"?","toolPortfolio":"Enterprise Product","NeedByDate":"29-Jun-2018","ApprovalID":"139"}]; Object.assign(obj[0], obj[0].approvals.approval); delete obj[0].approvals; console.log(obj[0]);
如果obj
數組中的多個項目具有需要轉移的approvals: { approval: { ... } }
屬性,請使用循環:
obj.forEach((object) => {
const { approvals } = object;
if (!approvals) return;
Object.assign(object, approvals.approval);
delete object.approvals;
});
如果可能的話,我還建議將obj
數組重命名為其他名稱-它是一個數組,而不是普通對象,因此可以將其命名為arr
以避免混淆。
使用lodash
更具可讀性(通過mergeWith和omit ),如下所示:
var data = { "toolSuite": "Enterprise Product", "toolStatus": "Active", "toolOwnerGroup": "PD", "toolTier": "1", "infoSec": "Yes", "sso": "?", "toolPortfolio": "Enterprise Product", "NeedByDate": "29-Jun-2018", "approvals": { "approval": { "ApprovalID": "139", "TaskID": "232", "SubmissionDate": "2018-10-03T22:19:24.153", "WhoSubmitted": "Q1234", "Approver": "Q5678", "IsCanceled": "0", "ApproverFirst": "Bob", "ApproverLast": "Builder", "ApproverNTID": "bbuilder" } } } const result = _(data) .mergeWith(data.approvals.approval) .omit('approvals') .value() console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
在將data
作為數組的情況下,您可以簡單地進行映射 ,因為您確實希望獲得與輸入相同數量的輸出:
var data = [{ "toolSuite": "Enterprise Product", "toolStatus": "Active", "toolOwnerGroup": "PD", "toolTier": "1", "infoSec": "Yes", "sso": "?", "toolPortfolio": "Enterprise Product", "NeedByDate": "29-Jun-2018", "approvals": { "approval": { "ApprovalID": "139", "TaskID": "232", "SubmissionDate": "2018-10-03T22:19:24.153", "WhoSubmitted": "Q1234", "Approver": "Q5678", "IsCanceled": "0", "ApproverFirst": "Bob", "ApproverLast": "Builder", "ApproverNTID": "bbuilder" } } }, { "toolSuite": "Enterprise Product", "toolStatus": "Active", "toolOwnerGroup": "PD", "toolTier": "1", "infoSec": "Yes", "sso": "?", "toolPortfolio": "Enterprise Product", "NeedByDate": "29-Jun-2018" }] const result = _.map(data, obj => _(obj) .mergeWith(_.get(obj,'approvals.approval')) .omit('approvals') .value()) console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.