Как сгладить массив с 2 вложенными объектами и сделать его одним - PullRequest
0 голосов
/ 30 ноября 2018

Я flatMapping массив элементов, где я получаю это:

tableRowsItems = _.flatMap(data.SoftLayerCancellationRequests, 'items');

Возвращает это:

[
  {
    "id": 11705294,
    "billingItemId": 361643044,
    "cancellationRequestId": 17289674,
    "immediateCancellationFlag": true,
    "scheduledCancellationDate": null,
    "serviceReclaimStatusCode": "COMPLETE",
    "billingItem": {
      "id": 361643044,
      "recurringFee": 0,
      "description": "Storage as a Service",
      "cancellationDate": "2018-11-27T10:20:42-06:00",
      "domainName": null,
      "hostName": null,
      "item": {
        "id": 9571,
        "description": "Storage as a Service",
        "keyName": "STORAGE_AS_A_SERVICE",
        "longDescription": null,
        "units": "N/A",
      }
    }
  },
  {
    "id": 11705292,
    "billingItemId": 361643052,
    "cancellationRequestId": 17289672,
    "immediateCancellationFlag": true,
    "scheduledCancellationDate": null,
    "serviceReclaimStatusCode": "COMPLETE",
    "billingItem": {
      "id": 361643052,
      "recurringFee": 0,
      "description": "Storage as a Service",
      "cancellationDate": "2018-11-27T10:18:18-06:00",
      "domainName": null,
      "hostName": null,
      "item": {
        "id": 9571,
        "description": "Storage as a Service",
        "keyName": "STORAGE_AS_A_SERVICE",
        "longDescription": null,
        "units": "N/A",
      }
    }
  }
]

Итак, в конце мне нужно что-то вроде этого:

[
{
  "id": 11705294,
  "billingItemId": 361643044,
  "cancellationRequestId": 17289674,
  "immediateCancellationFlag": true,
  "scheduledCancellationDate": null,
  "serviceReclaimStatusCode": "COMPLETE",
  "recurringFee": 0,
  "description": "Storage as a Service",
  "cancellationDate": "2018-11-27T10:20:42-06:00",
  "domainName": null,
  "hostName": null,
  "item": {
  "id": 9571,
    "description": "Storage as a Service",
    "keyName": "STORAGE_AS_A_SERVICE",
    "longDescription": null,
    "units": "N/A",
  }
},
]

Но мне нужно сделать элемент выставления счетов частью того же объекта, как еще я могу сгладить его еще?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

С lodash это одна строка с .omit и .extend :

const data = [ { "id": 11705294, "billingItemId": 361643044, "cancellationRequestId": 17289674, "immediateCancellationFlag": true, "scheduledCancellationDate": null, "serviceReclaimStatusCode": "COMPLETE", "billingItem": { "id": 361643044, "recurringFee": 0, "description": "Storage as a Service", "cancellationDate": "2018-11-27T10:20:42-06:00", "domainName": null, "hostName": null, "item": { "id": 9571, "description": "Storage as a Service", "keyName": "STORAGE_AS_A_SERVICE", "longDescription": null, "units": "N/A", } } }, { "id": 11705292, "billingItemId": 361643052, "cancellationRequestId": 17289672, "immediateCancellationFlag": true, "scheduledCancellationDate": null, "serviceReclaimStatusCode": "COMPLETE", "billingItem": { "id": 361643052, "recurringFee": 0, "description": "Storage as a Service", "cancellationDate": "2018-11-27T10:18:18-06:00", "domainName": null, "hostName": null, "item": { "id": 9571, "description": "Storage as a Service", "keyName": "STORAGE_AS_A_SERVICE", "longDescription": null, "units": "N/A", } } } ]

const result = _.flatMap(data, x => _.omit(_.extend(x, {item: x.billingItem.item}), ['billingItem']))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Более понятный пример будет с lodash chaining:

const data = [ { "id": 11705294, "billingItemId": 361643044, "cancellationRequestId": 17289674, "immediateCancellationFlag": true, "scheduledCancellationDate": null, "serviceReclaimStatusCode": "COMPLETE", "billingItem": { "id": 361643044, "recurringFee": 0, "description": "Storage as a Service", "cancellationDate": "2018-11-27T10:20:42-06:00", "domainName": null, "hostName": null, "item": { "id": 9571, "description": "Storage as a Service", "keyName": "STORAGE_AS_A_SERVICE", "longDescription": null, "units": "N/A", } } }, { "id": 11705292, "billingItemId": 361643052, "cancellationRequestId": 17289672, "immediateCancellationFlag": true, "scheduledCancellationDate": null, "serviceReclaimStatusCode": "COMPLETE", "billingItem": { "id": 361643052, "recurringFee": 0, "description": "Storage as a Service", "cancellationDate": "2018-11-27T10:18:18-06:00", "domainName": null, "hostName": null, "item": { "id": 9571, "description": "Storage as a Service", "keyName": "STORAGE_AS_A_SERVICE", "longDescription": null, "units": "N/A", } } } ]

const result = _.flatMap(data, x => _(x)
   .extend({item: x.billingItem.item})
   .omit(['billingItem'])
   .value()
);
		
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Это в значительной степени считывает то, что происходит, что является одним из преимуществ lodash цепочки, когда речь идет о читабельности кода и т. Д.

0 голосов
/ 30 ноября 2018

Разрушить объект (используя остальные параметры ) и создать новый объект (используя синтаксис ), отбрасывая любые нежелательные свойства (например, id) вдольпуть.

const obj = {"id":11705294,"billingItemId":361643044,"cancellationRequestId":17289674,"immediateCancellationFlag":true,"scheduledCancellationDate":null,"serviceReclaimStatusCode":"COMPLETE","billingItem":{"id":361643044,"recurringFee":0,"description":"Storage as a Service","cancellationDate":"2018-11-27T10:20:42-06:00","domainName":null,"hostName":null,"item":{"id":9571,"description":"Storage as a Service","keyName":"STORAGE_AS_A_SERVICE","longDescription":null,"units":"N/A"}}};

// Extract `id` from billingItem, and assign all other
// billingItem properties to `restItem` using rest parameters
// Assign all the other (non-billingTime) properties of obj
// to the variable `rest`
const { billingItem: { id, ...restItem }, ...rest } = obj;

// Spread `rest` and `restItem` back out to create
// the new properties of the new object. Note: we haven't
// added that id here - we've plucked it from the object and
// discarded it
const newObj = { ...rest, ...restItem }; 
console.log(newObj);

Если у вас есть массив этих объектов, просто используйте map, чтобы вернуть новый массив новых объектов.

const arr = [{"id":11705294,"billingItemId":361643044,"cancellationRequestId":17289674,"immediateCancellationFlag":true,"scheduledCancellationDate":null,"serviceReclaimStatusCode":"COMPLETE","billingItem":{"id":361643044,"recurringFee":0,"description":"Storage as a Service","cancellationDate":"2018-11-27T10:20:42-06:00","domainName":null,"hostName":null,"item":{"id":9571,"description":"Storage as a Service","keyName":"STORAGE_AS_A_SERVICE","longDescription":null,"units":"N/A"}}}];

const newArr = arr.map(obj => {
  const { billingItem: { id, ...restItem }, ...rest } = obj;
  return { ...rest, ...restItem };
});

console.log(newArr);
...