Как избежать вложенных карт, чтобы получить нужные мне значения из вложенных массивов? - PullRequest
0 голосов
/ 28 ноября 2018

Я делаю что-то вроде этого, чтобы получить нужные мне значения:

   tableRowsItems = data.softy.map(row =>
      row.items.map(item => console.log('item', item)),
    );

С этим я получаю что-то похожее на картинке ниже, что именно то, что мне нужно

enter image description here

Мой вопрос, является ли это правильным способом ES6 сделать это.Я также использую lodash, если это помогает.

Вот так выглядит файл json без карты:

[
 {
  "ticketId": 67973802,
  "account": null,
  "items": [
    {
      "id": 11705294,
      "billingItemId": 361643044,
      "cancellationRequestId": 17289674,
      "immediateCancellationFlag": true,
      "scheduledCancellationDate": null,
      "serviceReclaimStatusCode": "COMPLETE",
      "billingItem": {
        "description": "Storage as a Service",
        "recurringFee": 0,
        "id": 361643044
      }
    }
  ]
 },
 ...
]
... 

Мне нужно то, что вы видите на items клавиша

Ответы [ 4 ]

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

Приведенные выше ответы помогут вам достичь цели, но мы используем .map, когда мы хотим вернуть что-то из цикла, в противном случае вы должны использовать forEach.

Я знаю, что на самом деле не имеет смысла даватьвопросы но все же.хотел положить в ветку.

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

Lodash имеет flatMap (версия native JS еще не поддерживается во всех браузерах), и вы можете использовать ее как:

var items = _.flatMap(tickets, t => t.items);

дляполучить все items от всех билетов в одном массиве 1-й:

var tickets = [{
    "ticketId": 67973802,
    "account": null,
    "items": [{
      "id": 117052912,
      "billingItemId": 36164304123,
    }, {
      "id": 11705232,
      "billingItemId": 361643044,
    }]
  },
  {
    "ticketId": 67973802,
    "account": null,
    "items": [{
      "id": 117052945,
      "billingItemId": 361643046,
    }, {
      "id": 117052953,
      "billingItemId": 361643049,
    }]
  }
];

var items = _.flatMap(tickets, t => t.items);
console.log(items);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 28 ноября 2018

Используя ES6 , вы можете легко сделать одну строковую функцию, чтобы помочь вам сгладить вложенный массив с помощью свойства items через Array.reduce :

var tickets = [{ "ticketId": 67973802, "account": null, "items": [{ "id": 117052912, "billingItemId": 36164304123, }, { "id": 11705232, "billingItemId": 361643044, }] }, { "ticketId": 67973802, "account": null, "items": [{ "id": 117052945, "billingItemId": 361643046, }, { "id": 117052953, "billingItemId": 361643049, }] } ];
 
const pullBy = (arr, prop) => arr.reduce((r,c) => [...r[prop], ...c[prop]])
 
console.log(pullBy(tickets, 'items'))

При использовании lodash лучшим вариантом будет flatMap :

var tickets = [{ "ticketId": 67973802, "account": null, "items": [{ "id": 117052912, "billingItemId": 36164304123, }, { "id": 11705232, "billingItemId": 361643044, }] }, { "ticketId": 67973802, "account": null, "items": [{ "id": 117052945, "billingItemId": 361643046, }, { "id": 117052953, "billingItemId": 361643049, }] } ];
 
const result = _.flatMap(tickets, 'items')
 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 28 ноября 2018

Если я правильно понимаю ваш вопрос, вы пытаетесь извлечь все вложенные items из вашего массива ticket объектов - в этом случае вы можете добиться этого путем сопоставления входных билетов с массивом items массивов, а затем сгладить результат, чтобы сложить в него массив из item объектов, например, так:

var output = input
.map(ticket => ticket.items) // Map each ticket to array of ticket items
.flat(); // Reduce array of item arrays to combined array of items

var input = [
{
  "ticketId": 67973802,
  "account": null,
  "items": [
    {
      "id": 11705294,
      "billingItemId": 361643044,
      "cancellationRequestId": 17289674,
      "immediateCancellationFlag": true,
      "scheduledCancellationDate": null,
      "serviceReclaimStatusCode": "COMPLETE",
      "billingItem": {
        "description": "Storage as a Service",
        "recurringFee": 0,
        "id": 361643044
      }
    }
  ]
 },
 {
  "ticketId": 67973802,
  "account": null,
  "items": [
    {
      "id": 11705294,
      "billingItemId": 361643044,
      "cancellationRequestId": 17289674,
      "immediateCancellationFlag": true,
      "scheduledCancellationDate": null,
      "serviceReclaimStatusCode": "COMPLETE",
      "billingItem": {
        "description": "Storage as a Service",
        "recurringFee": 0,
        "id": 361643044
      }
    }
  ]
 }
 ];
 
 var output = input.map(ticket => ticket.items).flat();
 
 console.log(output);
...