Цикл трехуровневого массива - PullRequest
0 голосов
/ 01 июня 2018

enter image description here Здравствуйте, у меня есть массив с тремя уровнями.Третий уровень состоит из массива, каждый из которых содержит до 3 объектов.Внутри каждого объекта есть свои данные.Я ищу, чтобы перебрать каждый массив, который содержит объекты и собрать количество строки состояния.Это будет либо «Пройдено», «Сбой».Данные являются динамическими и передаются в пользовательский интерфейс с использованием API-маршрута с node.js с использованием JSON.stringify.У меня есть доступ ко всему массиву, используя

 $.getJSON("/automation/api/pos_reports")
.then(addData)

  function addData(data) {
  var postotal = (data.posreports.length)
  $('#posTotal').append(postotal);

  let posreports = data.posreports;
  console.log(posreports)

. Мне посоветовали использовать Ramda.js, который будет самым простым в использовании.Любая помощь приветствуется.Открыт для использования нативного JS, jQuery или библиотеки, такой как Ramda.js.Спасибо.

Пример массива:

let data = [
    [
        [    
            {result: "Passed"},
            {result: "Failed"},
            {}
        ],
        [
            {result: "Passed"},
            {result: "Passed"},
            {result: "Failed"}
        ],
        [
            {result: "Passed"},
            {result: "Passed"},
            {result: "Failed"}
        ],
        [
            {result: "Passed"},
            {result: "Passed"},
            {result: "Failed"}
        ],
        [
            {result: "Failed"},
            {},
            {}
        ]
    ]
]

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Вы можете попытаться сгладить массив и уменьшить его до одного результата:

const data = [
  [
    [
      { result: "Passed" },
      { result: "Failed" },
      {}
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Failed" },
      {},
      {}
    ]
  ]
];

const flatten = array =>
  array.reduce(
    (result,item)=>
      Array.isArray(item)
        ? result.concat(flatten(item))
        : result.concat(item),
    []
  )
;

console.log(
  flatten(data)
  .reduce(
    (result,item)=>{
      if(item.result==="Passed"){
        result.passed++;
      }
      if(item.result==="Failed"){
        result.failed++;
      }
      return result;
    },
    {passed:0,failed:0}
  )
);

Если вам нужен другой формат итогов, возможно, это то, что вы имели в виду:

const data = [
  [
    [
      { result: "Passed" },
      { result: "Failed" },
      {}
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Passed" },
      { result: "Passed" },
      { result: "Failed" }
    ],
    [
      { result: "Failed" },
      {},
      {}
    ]
  ]
];

const flatten = array =>
  array.reduce(
    (result,item)=>result.concat(item),
    []
  )
;

console.log(
  flatten(data)
  .reduce(
    (result,item)=>
      result.concat(
        item.reduce(
          (result,item)=>{
            if(item.result==="Passed"){
              result.passed++;
            }
            if(item.result==="Failed"){
              result.failed++;
            }
            return result;
          },
          {passed:0,failed:0}
        )
      ),
      []
  )
);
0 голосов
/ 01 июня 2018

Простой цикл достаточен для достижения того, что вы хотите, и не использует никаких дополнительных ресурсов.:)

@ Edit: предоставленный вами пример массива фактически отличается от ваших реальных данных.В этом примере у вас есть 3-х мерный массив, где в ваших данных у вас есть массив объектов, в которых есть массив объектов.:) Вот почему код должен быть изменен.

    let data = [
      {"results": 
        [    
          {result: "Passed"},
          {result: "Failed"},
          {}
        ]
      },
      {"results": 
        [    
          {result: "Passed"},
          {result: "Failed"},
          {result: "Passed"},
        ]
      },
      {"results": 
        [    
          {result: "Passed"},
          {result: "Failed"},
          {}
        ]
      },
      {"results": 
        [    
          {result: "Passed"},
          {result: "Failed"},
          {}
        ]
      },
    ];

    let count = {"Passed": 0, "Failed": 0};

    for (let i = 0; i < data.length; i++){
      if (!data[i].results) continue;
      for (let j = 0; j < data[i].results.length; j++){
        let el = data[i].results[j].result;
        if (el) count[el]++;
      }
    }

    console.log(count);
0 голосов
/ 01 июня 2018

Кроме того, вы можете использовать сокращение вместо карты, если вы хотите объединить в один хеш

let data = [
[
  [
    {result: "Passed"},
    {result: "Failed"},
    {}
  ],
  [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
  [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
   [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
   [
     {result: "Failed"},
    {},
    {}
  ]
 ]
]

function CountPassFail(arr)
{
  let hash = {'Passed': 0, 'Failed':0}
  arr.forEach(val => {
    if(!val.result) return;
    let res = val.result;

    hash[res] += 1;
  })
  return hash
}

let count = data[0].reduce((hash,cell) => {
  cellHash = CountPassFail(cell);
  hash.Passed += cellHash.Passed;
  hash.Failed += cellHash.Failed;
  
  return hash;
  }, {Passed: 0, Failed : 0});
  
  console.log(count);
0 голосов
/ 01 июня 2018

Вы можете использовать карту, чтобы вернуть массив объектов, с проходом и неудачей.Используйте метод карты массивов: D

let data = [
[
  [
    {result: "Passed"},
    {result: "Failed"},
    {}
  ],
  [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
  [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
   [
     {result: "Passed"},
    {result: "Passed"},
    {result: "Failed"}
  ],
   [
     {result: "Failed"},
    {},
    {}
  ]
 ]
]

function CountPassFail(arr)
{
  let hash = {'Passed': 0, 'Failed':0}
  arr.forEach(val => {
    if(!val.result) return;
    let res = val.result;
    hash[res] += 1;
  })
  return hash
}

console.log(data[0].map(cell => CountPassFail(cell)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...