如何总结json属性值?

时间:2017-11-21 22:57:52

标签: javascript json

我正在尝试从每个属性中获取不同值的数量。

示例:

  data = [
    { dataA: '001a', dataB: '123456', dataC: 'true', dataD: 'normal', dataE: 'ON' },
    { dataA: '002a', dataB: '567890', dataC: 'true', dataD: 'exception', dataE: 'ON' },
    { dataA: '003a', dataB: '098767', dataC: 'true', dataD: 'normal', dataE: 'ON' },
    { dataA: '001a', dataB: '234567', dataC: 'false', dataD: 'normal', dataE: 'ON' }
  ];

结果应为:

result = [
    { dataA: '3', dataB: '4', dataC: '2', dataD: '2', dataE: '1' },
  ];

这是我到目前为止所得到的:

data = [
  { dataA: '001a', dataB: '123456', dataC: 'true', dataD: 'normal', dataE: 'ON' },
  { dataA: '002a', dataB: '123456', dataC: 'true', dataD: 'exception', dataE: 'ON' },
  { dataA: '003a', dataB: '098767', dataC: 'true', dataD: 'normal', dataE: 'OFF' },
  { dataA: '001a', dataB: '567890', dataC: 'false', dataD: 'normal', dataE: 'ON' }
];

let resume = {};
resume = data.reduce((total, items) => {
  Object.keys(items).map((keys) => {
    total[items[keys]] = (total[items[keys]] || 0) + 1;
  });
  return total;
}, {});

console.log(resume);

const counter = Object.values(resume).reduce((r, k) => r + k, 0);
console.log(counter);

3 个答案:

答案 0 :(得分:2)

以下是您可以使用的一种利用Array.prototype.reduce()

的方法

var data = [{
    dataA: '001a',
    dataB: '123456',
    dataC: 'true',
    dataD: 'normal',
    dataE: 'ON'
  },
  {
    dataA: '002a',
    dataB: '567890',
    dataC: 'true',
    dataD: 'exception',
    dataE: 'ON'
  },
  {
    dataA: '003a',
    dataB: '098767',
    dataC: 'true',
    dataD: 'normal',
    dataE: 'ON'
  },
  {
    dataA: '001a',
    dataB: '234567',
    dataC: 'false',
    dataD: 'normal',
    dataE: 'ON'
  }
];

function getResult(objArray) {
  var result = {};
  Object.entries(data.reduce(function(total, currentVal) {
    for (var prop in currentVal) {
      if (total[prop]) {
        if (total[prop].indexOf(currentVal[prop]) === -1)
          total[prop].push(currentVal[prop]);
      } else {
        total[prop] = [currentVal[prop]];
      }
    }
    return total;

  }, {})).forEach(function(element) {
    result[element[0]] = element[1].length.toString();
  });

  return result;
}

console.log(getResult(data));

答案 1 :(得分:1)

试试这个:

var data = [
    { dataA: '001a', dataB: '123456', dataC: 'true', dataD: 'normal', dataE: 'ON' },
    { dataA: '002a', dataB: '567890', dataC: 'true', dataD: 'exception', dataE: 'ON' },
    { dataA: '003a', dataB: '098767', dataC: 'true', dataD: 'normal', dataE: 'ON' },
    { dataA: '001a', dataB: '234567', dataC: 'false', dataD: 'normal', dataE: 'ON' }
  ];

var dataA = [];
var dataB = [];
var dataC = [];
var dataD = [];
var dataE = [];

for (var i in data) {
  dataA.push(data[i].dataA);
  dataB.push(data[i].dataB);
  dataC.push(data[i].dataC);
  dataD.push(data[i].dataD);
  dataE.push(data[i].dataE);
}

var dataAlen = dataA.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

var dataBlen = dataB.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

var dataClen = dataC.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

var dataDlen = dataD.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

var dataElen = dataE.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

var newArr = [{"dataA":dataAlen,"dataB":dataBlen,"dataC":dataClen,"dataD":dataDlen,"dataE":dataElen}];

console.log(newArr);

答案 2 :(得分:1)

您可以使用array#reduce将所有对象累积到单个对象中。使用所有键,您可以使用新对象中的Set获取唯一值。然后只需为该键分配唯一值的长度。

var data = [ { dataA: '001a', dataB: '123456', dataC: 'true', dataD: 'normal', dataE: 'ON' }, { dataA: '002a', dataB: '567890', dataC: 'true', dataD: 'exception', dataE: 'ON' }, { dataA: '003a', dataB: '098767', dataC: 'true', dataD: 'normal', dataE: 'ON'}, { dataA: '001a', dataB: '234567', dataC: 'false', dataD: 'normal', dataE: 'ON' }];

var result = data.reduce((res, obj) => {
  Object.keys(obj).forEach(k => {
    res[k] ? res[k].push(obj[k]) : res[k] = [obj[k]]; 
  });
  return res;
},{});

var output = [Object.keys(result).reduce((r, k) => {
  r[k] = [...new Set(result[k])].length;
  return r;
}, {})];
console.log(output);