我正在尝试从每个属性中获取不同值的数量。
示例:
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);
答案 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);