Как получить индивидуальный идентификатор и номер Pass / Fail из массива? - PullRequest
0 голосов
/ 26 марта 2019

Вот массив данных, которые у меня есть. Мне нужен новый массив с уникальным идентификатором и номером индивидуального статуса Pass / Fail. Я использую угловой 6.

[
{"id":"2","status":"Passed"},
{"id":"5","status":"Passed"},
{"id":"7","status":"Passed"},
{"id":"2","status":"Passed"},
{"id":"9","status":"Passed"},
{"id":"0","status":"Passed"},
{"id":"10","status":"Passed"},
{"id":"4","status":"Passed"},
{"id":"8","status":"Passed"},
{"id":"5","status":"Passed"},
{"id":"7","status":"Passed"},
{"id":"0","status":"Passed"},
{"id":"1","status":"Passed"},
{"id":"0","status":"Passed"},
{"id":"1","status":"Passed"},
{"id":"0","status":"Passed"},
{"id":"11","status":"Passed"},
{"id":"4","status":"Passed"},
{"id":"2","status":"Passed"},
{"id":"5","status":"Passed"},
{"id":"2","status":"Passed"},
{"id":"5","status":"Passed"},
{"id":"2","status":"Passed"},
{"id":"5","status":"Failed"}
]

//JavaScript code

Ожидаю выхода

[
{"id":"1", "Passed": "2", "Failed": "0"},
{"id":"2", "Passed": "5", "Failed": "0"}....and so on]

на выходе должно быть 10 элементов.

Ответы [ 4 ]

0 голосов
/ 26 марта 2019

Было бы проще сделать это:

const results = [];
data.forEach(item => {
   const foundItem = results.find(result => result.id === item.id);
   if (!foundItem) {
      results.push({ 
         id: item.id, 
         Passed: (item.status === 'Passed') ? 1 : 0, 
         Failed: (item.status === 'Failed') ? 1 : 0
      });
   } else {
      if (item.status === 'Passed') foundItem.Passed += 1;
      else if (item.status === 'Failed') foundItem.Failed += 1;
   }
});
0 голосов
/ 26 марта 2019

Вы можете попробовать это следующим образом.

https://jsfiddle.net/o3016bh7/

Просто сказать, что есть класс для вашего {id, "Passed", "Failed"}, и он может считать целые числа позади«Passed» и «Failed».

class PassFailCounter {
    constructor(id) {
        this.id = id;
        this.Passed = 0;
        this.Failed = 0;
    }

    addPass() {
        this.Passed++;
    }

    addFail() {
        this.Failed++;
    }
}

Просто прочитайте данные и запомните их в Hashmap, подразумевая, что id уникален.После этого JSON.stringify () возвращает .values ​​() указанной карты, и вы получите точный результат, который вы упомянули.

let str = '[{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"2","status":"Passed"},{"id":"9","status":"Passed"},{"id":"0","status":"Passed"},{"id":"10","status":"Passed"},{"id":"4","status":"Passed"},{"id":"8","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"11","status":"Passed"},{"id":"4","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Failed"}]';

let data = JSON.parse(str);
let map = new Map();

data.forEach(entry => {
    let exist = map.get(Number(entry.id));
    if(!exist) {
        map.set(Number(entry.id), new PassFailCounter(Number(entry.id)));
        exist = map.get(Number(entry.id));
  }
  entry.status == "Passed" ? exist.addPass() : exist.addFail()      
});

console.log(JSON.stringify(Array.from(map.values())));

Возможно, не самое короткое решение, но оно работает.

Edit: вместо

JSON.stringify(Array.from(map.values()))

вы также можете сделать

JSON.stringify(Array.from(map.values()), function(key, value) {
    if(isNaN(value)) {
      return value;
    }
    return value.toString();
})

, если тип String важен на выходе.

0 голосов
/ 26 марта 2019

Попробуйте, только одна простая итерация:

let str = '[{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"2","status":"Passed"},{"id":"9","status":"Passed"},{"id":"0","status":"Passed"},{"id":"10","status":"Passed"},{"id":"4","status":"Passed"},{"id":"8","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"11","status":"Passed"},{"id":"4","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Failed"}]';

let data = JSON.parse(str);

let newData = {};

data.forEach(item => {

  // initial data if key doesn't exists
  if ( ! newData[item.id]) {
    newData[item.id] = { Passed:0, Failed:0 }; 
  } 

  // increment Failed or Passed value
  newData[item.id][item.status]++; 
});
0 голосов
/ 26 марта 2019

Вы можете использовать import * as _ from 'lodash'

let passItem = _.find(array, function (o) { return o.status == 'passed' }) 
let failItem = _.find(array, function (o) { return o.status == 'fail' }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...