Javascript Уменьшить или Свести объект? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть объект данных, с которым я работаю, он динамический и поступает из вызова базы данных.Если запись содержит 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, и он может переместить эти данные в родительский, это было бы идеально.

Какой подход я должен использовать с типом объекта?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

При использовании lodash это несколько более читабельно (через mergeWith и пропустите ), например:

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>
0 голосов
/ 04 октября 2018

Нет необходимости в библиотеке, просто поместите или 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;
});

IТакже рекомендую переименовать ваш массив obj во что-то другое, если это возможно - это массив, а не простой объект, поэтому, возможно, назовите его как arr, чтобы избежать путаницы.

...