我正在尝试实现以下代码:
var data = [];
var devicesObj = {};
var devices = clients.map(function(k) {
return k.os;
});
devices.sort();
var current = null;
var cnt = 0;
for (var i = 0; i <= devices.length; i++) {
if (devices[i] !== current) {
if (cnt > 0) {
devicesObj.label = current;
devicesObj.value = cnt;
}
data.push(devicesObj);
current = devices[i];
cnt = 1;
} else {
cnt++;
}
}
我们的想法是尝试遍历devices数组,获取每个元素的名称并计算它在数组中重复的次数。然后将当前元素名称分配给键标签下的对象,将总计数分配给值键。最后将新对象推送到新阵列。
映射到设备变量的数组结构:
{ _id: 58d095c272b61889a6688922,
id: 'k65f508',
os: 'Apple iPhone',
mac: 'f0:24:75' },
{ _id: 58d095c272b61889a6688923,
id: 'k00e8fc',
os: 'Android',
mac: '08:ec:a9' },
{ _id: 58d095c272b61889a6688924,
id: 'k65f637',
os: 'Android',
mac: 'c0:bd:d1' },
{ _id: 58d095c272b61889a6688925,
id: 'k00b0ec',
os: 'Windows',
mac: '74:e2:8c' },
{ _id: 58d095c272b61889a6688926,
id: 'k00328a',
os: 'Android',
mac: 'd0:87:e2' },
{ _id: 58d095c272b61889a6688927,
id: 'k0006b1',
os: 'Apple iPhone',
mac: '9c:d3:5b' }
执行代码后,我得到以下结果:
[
{
"label": "Apple iPhone",
"value": 2
},
{
"label": "Apple iPhone",
"value": 2
},
{
"label": "Apple iPhone",
"value": 2
},
{
"label": "Apple iPhone",
"value": 2
},
{
"label": "Apple iPhone",
"value": 2
},
{
"label": "Apple iPhone",
"value": 2
}
]
请帮助!!
答案 0 :(得分:0)
你一遍又一遍地推动同一个物体。试试这个:
for (var i = 0; i < devices.length; i++) {
if (devices[i] !== current) {
if (cnt > 0) {
data.push({label: current, value: cnt});
}
current = devices[i];
cnt = 0;
}
cnt++;
}
if (cnt > 0) {
data.push({label: current, value: cnt});
}
答案 1 :(得分:-1)
有很多问题。一个是你重复使用相同的对象,这就是为什么你最终得到具有相同值的所有数组元素。
另一个是你的循环中的逻辑有问题,无法正确地考虑数据的所有配置方式,并且在不应该的情况下继续将值推送到数组中。
另一个原因是当您使用<=
时,您在循环条件中使用<
。
试试这个:
var clients = getClients();
var devicesObj;
var devices = clients.map(function(k) {
return k.os;
});
devices.sort();
var current = null;
var data = [];
for (var i = 0; i < devices.length; i++) {
if (current !== devices[i]) {
current = devices[i];
devicesObj = { label: current, value: 0 };
data.push(devicesObj);
}
devicesObj.value += 1;
}
console.log(data);
// sample clients data
function getClients() {
return [{
_id: '58d095c272b61889a6688922',
id: 'k65f508',
os: 'Apple iPhone',
mac: 'f0:24:75'
},
{
_id: '58d095c272b61889a6688923',
id: 'k00e8fc',
os: 'Android',
mac: '08:ec:a9'
},
{
_id: '58d095c272b61889a6688924',
id: 'k65f637',
os: 'Android',
mac: 'c0:bd:d1'
},
{
_id: '58d095c272b61889a6688925',
id: 'k00b0ec',
os: 'Windows',
mac: '74:e2:8c'
},
{
_id: '58d095c272b61889a6688926',
id: 'k00328a',
os: 'Android',
mac: 'd0:87:e2'
},
{
_id: '58d095c272b61889a6688927',
id: 'k0006b1',
os: 'Apple iPhone',
mac: '9c:d3:5b'
}
];
}