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

时间:2016-06-13 22:49:15

标签: javascript

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

["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;
}
编辑:男人这里有一些很棒的答案。你们会说“最好”的解决方案是什么?无论哪种方式,我从所有的答案中学到了很多,他们似乎都解决了我的问题。

5 个答案:

答案 0 :(得分:1)

我会将事件保存到count对象中。这利用了JS中的每个对象基本上都是HashMap

的事实
var inputArr = ["123", "456", "67","123", "456"... ];

var counter = {};
var outArr = [];
inputArr.foreach(function(number) {
  if(counter[number])
    counter[number] = counter[number] + 1;
  else
    counter[number] = 1;
});

for (var prop in counter) {
  if(counter.hasOwnProperty(prop)) {
    outArr.push([prop], counter[prop]);
  }
}

return outArr;

上面包含了inputArr的一个小伪代码,需要进行修正,但如果没有多次迭代任何对象或数组,这应该可以正常工作。

答案 1 :(得分:1)

这是一个解决方案:

var hashMap = {}; 

var list = ["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"];

list.forEach(function(u){
   if (!hashMap.hasOwnProperty(u)){
      hashMap[u] = 1;
   }
   else {
      hashMap[u] += 1;
   }
})

// hashMap : {
//  "123" : 12,
//  "456" : 12,
//  "678" : 12,
//  "891" : 12
// }

如果你想要一组唯一值:

var uniqueList = Object.keys(hashMap);

//uniqueList : ["123", "456", "678", "891"];

答案 2 :(得分:1)

您可以使用javascript对象,其中元素为键,计数为值。一旦循环遍历原始数组,就可以遍历哈希映射并转换为所需的数组。

<强> JS

var a = ["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 counter = {};
for ( var i = 0; i < a.length ; i ++) {
    var currentKey = a[i];
  if(counter.hasOwnProperty(currentKey)) {
    counter[currentKey] += 1;
  } else {
    counter[currentKey] = 1;
  }
}

计数器将是值&lt; - &gt;的散列图。数对:

Object {123: 12, 456: 12, 678: 12, 891: 12}

您可以遍历对象并将其转换为所需的数组:

var condensedArr = [];
for (var key in counter) {
    condensedArr.push(key);
  condensedArr.push(counter[key]);
}

这是一个有效的JSFiddle

答案 3 :(得分:1)

此方法使用数组中的值作为属性名称,属性值是它在数组中的次数。

// Input array
var gazinta = ["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 gazada;

gazada = countEmUp(gazinta);
console.log(gazada);

function countEmUp(gazinta) {
    // i is a counter
    // counted is an object where the value to be counted is the property name and the value is the count
    // flattened is a single-dimensional array with each value followed by its count
    var i, counted = {}, flattened = [];

    // Loop through the array
    for (i = 0; i < gazinta.length; i++) {
        // If this is a new element, meaning the property doesn't exist in the counted object
        if (typeof counted[gazinta[i]] === "undefined") {
            // Initialize it to zero
            counted[gazinta[i]] = 0;
        }
        // Increment the counter
        counted[gazinta[i]]++;
    }
    // Loop through the counted object and push the elements and counts onto the flattened array
    for (i in counted) {
        flattened.push(i,counted[i]);
    }
    return flattened;
}

答案 4 :(得分:1)

以下是使用reduceObject.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);