Tengo una pregunta relacionada con los datos filter y count de JSON object.

¿Cómo puedo filter y count el objects donde SIT = false? En los datos de ejemplo, esto sería 3.

¿Y el recuento si el número total de SIT? En los datos de ejemplo, esto sería 4.

Me gustaría hacer lo mismo para PROD.

He probado lo siguiente:

var SIT = response.filter(function (obj) {
    return obj.environment === "SIT";
});

Y

var SIT = [];
SIT = response.data.cis.filter(function (obj) {
    return obj.environment === "SIT";
});

Aquí están mis datos:

{
  "cis": {
    "dsbgchop193": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "dsbgchop194": {
      "environment": "SIT", 
      "is_compliant": true
    }, 
    "dsbgchop195": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "dsbgchop196": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "id": "2017.10.17", 
    "psbgwais1v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "psbgwais2v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "rsbgwais1v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "rsbgwais2v": {
      "environment": "PROD", 
      "is_compliant": true
    }
  }, 
  "rating": "", 
  "ssl": {}
}
0
onmyway 29 oct. 2017 a las 17:46

4 respuestas

La mejor respuesta
var data = {
  "cis": {
    "dsbgchop193": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "dsbgchop194": {
      "environment": "SIT", 
      "is_compliant": true
    }, 
    "dsbgchop195": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "dsbgchop196": {
      "environment": "SIT", 
      "is_compliant": false
    }, 
    "id": "2017.10.17", 
    "psbgwais1v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "psbgwais2v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "rsbgwais1v": {
      "environment": "PROD", 
      "is_compliant": false
    }, 
    "rsbgwais2v": {
      "environment": "PROD", 
      "is_compliant": true
    }
  }, 
  "rating": "", 
  "ssl": {}
}

var statistics = Object.keys(data.cis).reduce(function (stats, key) {
  var item = data.cis[key];
  if (item.environment === 'SIT') {
    stats.totalCount += 1;

    if (item.is_compliant) {
      stats.compliantCount += 1;
    }
  }
  return stats;
}, { totalCount: 0, compliantCount: 0 });

console.log('statistics : ', statistics);
.as-console-wrapper { max-height: 100%!important; top: 0; }
1
Peter Seliger 29 oct. 2017 a las 15:06

O con una clase dedicada:

let data =  {
  "cis": {
      "dsbgchop193": {"environment": "SIT", "is_compliant": false}
    , "dsbgchop194": {"environment": "SIT", "is_compliant": true}
    , "dsbgchop195": {"environment": "SIT", "is_compliant": false} 
    , "dsbgchop196": {"environment": "SIT", "is_compliant": false} 
    , "id": "2017.10.17"
    , "psbgwais1v": {"environment": "PROD", "is_compliant": false} 
    , "psbgwais2v": {"environment": "PROD", "is_compliant": false} 
    , "rsbgwais1v": {"environment": "PROD", "is_compliant": false}
    , "rsbgwais2v": {"environment": "PROD", "is_compliant": true}}, "rating": "", "ssl": {}
}
  
class FiltrableObject {
  constructor (h) {
    this.h = h;
  }
  filter (params) {
    return this.values.filter(params)
  }
  get values () {
    if (undefined===this._values){this._values = Object.values(this.h)}
    return this._values;
  }
}

function operate() {
  let filtrable = new FiltrableObject(data.cis);
  
  let notCompliantSIT = filtrable.filter(function (obj) {
    return obj.environment === "SIT" && !obj.is_compliant;
  })

  let allSIT = filtrable.filter(function (obj) {
    return obj.environment === "SIT";
  })

  console.log('notCompliantSITs count:',notCompliantSIT.length)
  console.log('allSITs count:', allSIT.length)
}
.as-console-wrapper{max-height:100%!important;top:0;}
<button onclick="operate()">OPERATE!</button>
1
user3114072user3114072 29 oct. 2017 a las 15:16

Puede contarlo con Array#reduce y verifique la condición mientras usa las teclas del objeto.

var data = { cis: { dsbgchop193: { environment: "SIT", is_compliant: false }, dsbgchop194: { environment: "SIT", is_compliant: true }, dsbgchop195: { environment: "SIT", is_compliant: false }, dsbgchop196: { environment: "SIT", is_compliant: false }, id: "2017.10.17", psbgwais1v: { environment: "PROD", is_compliant: false }, psbgwais2v: { environment: "PROD", is_compliant: false }, rsbgwais1v: { environment: "PROD", is_compliant: false }, rsbgwais2v: { environment: "PROD", is_compliant: true } }, rating: "", ssl: {} },
    count = Object.keys(data.cis).reduce(function (r, k) {
        return r + !!(data.cis[k].environment === 'SIT' && !data.cis[k].is_compliant);
    }, 0);

console.log(count);

Para un recuento de todos, puede agrupar por environment y is_compliant propiedades.

function inc(object, path) {
    var last = path.pop(),
        level = path.reduce(function (r, k) { return r[k] = r[k] || {}; }, object);

    level[last] = (level[last] || 0) + 1;
}

var data = { cis: { dsbgchop193: { environment: "SIT", is_compliant: false }, dsbgchop194: { environment: "SIT", is_compliant: true }, dsbgchop195: { environment: "SIT", is_compliant: false }, dsbgchop196: { environment: "SIT", is_compliant: false }, id: "2017.10.17", psbgwais1v: { environment: "PROD", is_compliant: false }, psbgwais2v: { environment: "PROD", is_compliant: false }, rsbgwais1v: { environment: "PROD", is_compliant: false }, rsbgwais2v: { environment: "PROD", is_compliant: true } }, rating: "", ssl: {} },
    count = {};

Object.keys(data.cis).forEach(function (k) {
    if (typeof data.cis[k] === 'object') {
        inc(count, [data.cis[k].environment, data.cis[k].is_compliant]);
    }
});

console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 29 oct. 2017 a las 16:00

filter es una función en matrices, no en objetos, por eso no funciona.

Puede usar Object.keys para obtener las claves, y asignarlos a los objetos en response.cis para obtener una matriz para que pueda filtrar:

var items = Object.keys(response.cis).map(k => response.cis[k]);

items.filter(o => o.environment === "SIT" && !o.is_compliant);
// prints 3

items.filter(o => o.environment === "SIT");
// prints 4
1
janos 29 oct. 2017 a las 14:54