Как преобразовать имена объектов JSON в имена элементов? Кроме того, удалить вложенный объект? - PullRequest
0 голосов
/ 06 января 2019

Используя Dataweave, я пытаюсь преобразовать это:

{
    "ConcurrentAsyncGetReportInstances": {
        "Max": 200,
        "Remaining": 200
    },
    "ConcurrentSyncReportRuns": {
        "Max": 20,
        "Remaining": 20
    },
    "DailyAnalyticsDataflowJobExecutions": {
        "Max": 50,
        "Remaining": 50
    },
    "DailyApiRequests": {
        "Max": 6175000,
        "Remaining": 6174972,
        "Ant Migration Tool": {
            "Max": 0,
            "Remaining": 0
        },
        "CLM_service_api": {
            "Max": 0,
            "Remaining": 0
        },
        "CRM_service_api": {
            "Max": 0,
            "Remaining": 0
        }
    },
    "DailyAsyncApexExecutions": {
        "Max": 325000,
        "Remaining": 324902
 }

В это:

[
{
    "name":"ConcurrentAsyncGetReportInstances",
    "max":200,
    "remaining":200 
},
{
    "name":"ConcurrentSyncReportRuns",
    "max":"20",
    "remaining":"20"    
},
{
    "name":"DailyAnalyticsDataflowJobExecutions",
    "max":50,
    "remaining":50  
},
{
    "name":"DailyApiRequests",
    "max":6175000,
    "remaining":6174972 
},
{
    "name":"DailyAsyncApexExecutions",
    "max":325000,
    "remaining":324902  
}
]

Также обратите внимание, что я не хочу никаких вложенных значений, как в DailyApiRequests

Я попытался использовать функцию карты, но не знаю, как правильно ее использовать. Все примеры, которые я видел, не показывают этот сценарий.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Аналогично Josué, но без введения ненужных зависимостей.

const obj = {} // your object above
const res = Object.entries(obj).map( [k, v] => ({
  name: k, 
  ...v
}))

Другой пример, но с простым циклом:

const obj = {}; // your object above
const res = []; // New object
for(const [k, v] of Object.entries(obj)) {
  res.push({
    ...v,
    name: k
  });
}

Пример, который будет работать в 10-летнем браузере:

var obj = {}; // your object above
var res = []; // New object
for(var key in obj) {
  if (!obj.hasOwnProperty(key)) continue;
  res.push({
    name: k, 
    max: obj[k].Max, 
    remaining: obj[k].Remaining
  });
}
0 голосов
/ 07 января 2019

Использование DataWeave

%dw 1.0
%input payload application/json
%output application/json
---
payload pluck ((value,key) -> {
    name: key,
    max: value.Max,
    remaining: value.Remaining
  } 
)
0 голосов
/ 06 января 2019

Если вы используете JavaScript , вы можете использовать пакет lodash и использовать его map функцию:

Код

const _ = require('lodash')

const obj = ... // your object above
const res = _.map(obj, (v, k) => ({
  name: k, 
  max: v.Max, 
  remaining: v.Remaining
}))

console.log(res)

выход

enter image description here

Посмотрите lodash документацию здесь

Другая вещь, которую вы можете сделать, - это перебрать свойства объекта вручную и сделать карту самостоятельно, но я думаю, что в итоге вы заново изобретете колесо и будете делать точно что lodash делает;) так, попробуй. Кстати, этот пакет потрясающий, он очень полезен .

...