我需要查看一组未知值并计算每个唯一值的数量,并将计数和值推送到一个新数组中。所以我要说我有以下数组:
["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;
}
编辑:男人这里有一些很棒的答案。你们会说“最好”的解决方案是什么?无论哪种方式,我从所有的答案中学到了很多,他们似乎都解决了我的问题。
答案 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)
以下是使用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);