当元素未知时,如何获取数组中元素的数量

时间:2015-11-11 18:32:10

标签: javascript arrays

所以我试图找出如何生成一个关联数组,列出数组的元素,以及每个元素出现的次数,而不知道事先是什么元素。

举个例子,假设我有一系列动物: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

得到像我一样的对象。问题当然是根据动物的数量,这变得非常冗长和重复。同样,如果我不知道每种动物是什么,我就不能用这种方式创造物体。必须有一种方法可以在不知道这些信息的情况下做到这一点,但我被卡住了。

7 个答案:

答案 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;
&#13;
&#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原型是否包含动物条目并增加或初始化值。