簡體   English   中英

用Javascript縮小或展平一個對象?

[英]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用於其他項目,但找不到任何可以輕松執行此操作的操作。

對於這種情況,是否需要reduceflatten 應該永遠只不過是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更具可讀性(通過mergeWithomit ),如下所示:

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM