Javascript迭代一个数组,计算每个元素出现的次数并将其推送到一个对象

时间:2017-03-21 11:17:03

标签: javascript arrays object

我正在尝试实现以下代码:

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
  }
]

请帮助!!

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'
  }
];
}