计算并记录数组中匹配的未知数据

用户名

我需要查看一个未知值数组,并计算每个唯一值的数量,然后将计数和值推到一个新数组中。所以说我有以下数组:

["123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891"]

我想获取此数组并从中获取以下数组:

["123", 12, "456", 12, "678", 12, "891", 12]

无论原始数组中有多少个值,它都会获取值和出现的次数:

["value", number of occurences]

这是我为完成此任务而做的尝试,但还是很粗略,我想学习/使用一种更清洁的方法。

function _sortData(data) {
 var tempDataHolder = [];
 var dataId = data[0];
 var matches = 0;
 var dataLength = data.length;
 for (var i = 0; i <= dataLength - 1; i++) {
  if(dataId === data[i]) {
    matches++;
    data.splice(i, 1);
    i--;
  } else if(data.length === 1 && dataId === data[0]) {
    matches++;
  }
  if(i >= data.length){
    tempDataHolder.push(dataId, matches);
    if(data[0]){
      i = 0;
      dataLength = data.length;
      dataId = data[0];
      matches = 0;
    }
  }
 }
 return tempDataHolder;
}

编辑:男人在这里有一些很棒的答案。你们会说什么是“最佳”解决方案?无论哪种方式,我都可以从所有答案中学到很多东西,它们似乎都可以解决我的问题。

亭子

这是使用reduce的解决方案Object.keys

function sortData(data) {
  var map = data.reduce(function (map, val) {
    map[val] = (map[val] || 0) + 1;
    return map;
  }, {});
  return Object.keys(map).reduce(function (result, key) {
    return result.concat([key, map[key]]);
  }, []);
}

// Test it:
var data = ["123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891", "123", "456", "678", "891"];
var result = sortData(data);
console.log(result);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章