所以我试图找出如何生成一个关联数组,列出数组的元素,以及每个元素出现的次数,而不知道事先是什么元素。
举个例子,假设我有一系列动物:var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino']
我想生成一个最终看起来像的对象:
{ 'Rhino': 2, 'Lion': 1, 'Dog': 1, 'Parrot': 2, 'Cat': 1, 'Zebra': 1 }
如果我事先知道阵列中的动物是什么,我当然可以这样做:
var animalsCount = {};
var numberOfRhinos = animals.filter(function(animal) {
return animal == 'Rhino'
}).length;
animalsCount['Rhino'] = numberOfRhinos
得到像我一样的对象。问题当然是根据动物的数量,这变得非常冗长和重复。同样,如果我不知道每种动物是什么,我就不能用这种方式创造物体。必须有一种方法可以在不知道这些信息的情况下做到这一点,但我被卡住了。
答案 0 :(得分:19)
最简单的方法是创建一个地图,将数组中的值初始化为(1)作为该地图上的属性。每次看到未定义的属性时,都可以增加属性的值。
function countObjs(arr) {
// So the object doesn't inherit from Object.prototype and avoids property
// name collisions
var obj = Object.create(null);
arr.forEach(function(item) {
if (obj[item]) {
obj[item]++;
} else {
obj[item] = 1;
}
});
return obj;
}
var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino'];
console.log(countObjs(animals));
/*
Cat: 1
Dog: 1
Lion: 1
Parrot: 2
Rhino: 2
Zebra: 1
*/
答案 1 :(得分:5)
只需通过循环动物生成一本字典,然后再将它填满你的动物。
var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino'];
var animals_dict={};
for(var i=0;i<animals.length;i++){
animals_dict[animals[i]]=0;
}
for(var i=0;i<animals.length;i++){
animals_dict[animals[i]]=animals_dict[animals[i]]+1;
}
alert(JSON.stringify(animals_dict))
&#13;
答案 2 :(得分:4)
使用属性循环遍历数组元素并将它们存储在对象中。
var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot','Cat', 'Zebra', 'Rhino'];
var animalsCount = {};
for(var i = animals.length - 1; i >=0; i--) {
var count = animalsCount[animals[i]];
if(!count) count = 1;
else count++;
animalsCount[animals[i]] = count;
}
console.log(animalsCount);
//Outupt {Rhino: 2, Zebra: 1, Cat: 1, Parrot: 2, Dog: 1…}
//accessing particular animal count
animalsCount['Cat']; //outputs 1
答案 3 :(得分:3)
你可以遍历数组中的每个元素,在计数对象中创建一个键(关联数组在JS中称为刚被调用的对象)如果一个不存在并将其设置为1,或者如果它存在则添加到值。
animals.forEach(function(animal){
var count;
count = animalsCount[animal];
if (count){
animalsCount[animal] = count + 1;
} else {
animalsCount[animal] = 1;
}
})
答案 4 :(得分:2)
您可以轻松地在两个阵列中获取它,如下所示。
var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino'];
function foo(arr) {
var a = [],
b = [],
prev;
arr.sort();
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== prev) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length - 1]++;
}
prev = arr[i];
}
return [a, b];
}
console.log(foo(animals));
免责声明:输出数组按字母顺序排序。
答案 5 :(得分:2)
underscore中的countBy
可能符合您的要求。
_.countBy(animals, function(n) { return n; })
输出:
{ 'Rhino': 2, 'Lion': 1, 'Dog': 1, 'Parrot': 2, 'Cat': 1, 'Zebra': 1 }
答案 6 :(得分:1)
您可以使用lodash之类的库来获得此结果。
否则你可以迭代你的数组。检查您的animalsCount
原型是否包含动物条目并增加或初始化值。