57

I would like to know if there is a native javascript code that does the same thing as this:

function f(array,value){
    var n = 0;
    for(i = 0; i < array.length; i++){
        if(array[i] == value){n++}
    }
    return n;
}
6
  • 3
    In my honest opinion the for loop you have is a lot cleaner than using reduce. There's no single built-in method to do it, the closest you can get is built-in methods that'll loop the array for you. Commented May 21, 2016 at 16:41
  • The function and the loop you provided does what you want it to do. What is the reason you are looking for another method? Is it for performance reasons? Do you have a large array and want to avoid going through the whole array? Knowing what your problem is helps with the answer. Commented May 21, 2016 at 17:55
  • @SaeedD., for counting, you need to inspect every element. Commented May 21, 2016 at 18:13
  • @Nina, You can also use indexOf to find and count elements. See my working code below. But I like RomanPerekhrest answer and use of filter. Commented May 21, 2016 at 18:21
  • @SaeedD., yes, but it has two loops, one while and one indexof loop. Commented May 21, 2016 at 18:24

12 Answers 12

85

There might be different approaches for such purpose.
And your approach with for loop is obviously not misplaced(except that it looks redundantly by amount of code).
Here are some additional approaches to get the occurrence of a certain value in array:

  • Using Array.forEach method:

      var arr = [2, 3, 1, 3, 4, 5, 3, 1];
    
      function getOccurrence(array, value) {
          var count = 0;
          array.forEach((v) => (v === value && count++));
          return count;
      }
    
      console.log(getOccurrence(arr, 1));  // 2
      console.log(getOccurrence(arr, 3));  // 3
    
  • Using Array.filter method:

      function getOccurrence(array, value) {
          return array.filter((v) => (v === value)).length;
      }
    
      console.log(getOccurrence(arr, 1));  // 2
      console.log(getOccurrence(arr, 3));  // 3
    
Sign up to request clarification or add additional context in comments.

Comments

50

Another option is to use Array.filter():

count = myArray.filter(x => x === searchValue).length;

3 Comments

I like the simplicity. I suggest using a === comparator though.
It does not work because filter returns an array with just one of the similar elements. So, the length is always one.
@RezaNikfal That's not true, it works perfectly fine.
33

You could use reduce to get there:

Working example

var a = [1,2,3,1,2,3,4];

var map = a.reduce(function(obj, b) {
  obj[b] = ++obj[b] || 1;
  return obj;
}, {});

2 Comments

My vote goes to this one since I guess this is exactly the fundamental answer to all questions starting with "give me a solution to find the number of times each... bla bla.
This is definitely the best answer here. concise and gives you a data structure which can be manipulated easier.
9

You can also use forEach

let countObj = {};
let arr = [1,2,3,1,2,3,4];

let countFunc = keys => {
  countObj[keys] = ++countObj[keys] || 1;
}

arr.forEach(countFunc);

// {1: 2, 2: 2, 3: 2, 4: 1}

Comments

9

Here is my solution without using an additional object and using reduce:

const occurrencesOf = (number,numbers) => numbers.reduce((counter, currentNumber)=> (number === currentNumber ? counter+1 : counter),0);
occurrencesOf(1, [1,2,3,4,5,1,1]) // returns 3
occurrencesOf(6, [1,2,3,4,5,1,1]) // returns 0
occurrencesOf(5, [1,2,3,4,5,1,1]) // returns 1

Comments

3

You could use the Array filter method and find the length of the new array like this

const count = (arr, value) => arr.filter(val => val === value).length

1 Comment

Can you make the difference to stackoverflow.com/a/59573631/7733418 more obvious? I do not get it and you want to avoid the unfavorable impression that might cause.
2
let ar = [2,2,3,1,4,9,5,2,1,3,4,4,8,5];

const countSameNumber = (ar: any, findNumber: any) => {
    let count = 0;
    ar.map((value: any) => {
        if(value === findNumber) {
            count = count + 1;
        }
    })
    return count;
}


let set = new Set(ar);
for (let entry of set) {
    console.log(entry+":", countSameNumber(ar, entry));
}

1 Comment

Hi Rai. Thanks for your answer. Usually answers with an explanation are more welcomed there. Would you like to add an explanation to your answer?
2
const arr = ["a", "a", "a", "b", "b", "b", "b", "c", "c", "c"];

function countValues(array, countItem) {
  let count = 0;
  array.forEach(itm => {
    if (itm === countItem) count++;
  });
  console.log(`${countItem} ${count}`);
}

countValues(arr, "c");

Comments

1

This is how I did mine using just a for loop. It's not as sophisticated as some of the answers above but it worked for me.

function getNumOfTimes(arrayOfNums){
    let found = {}
        for (let i = 0; i < arrayOfNums.length; i++) {
            let keys = arrayOfNums[i].toString()
            found[keys] = ++found[arrayOfNums[i]] || 1
        }

    return found
}

getNumOfTimes([1, 4, 4, 4, 5, 3, 3, 3])

// { '1': 1, '3': 3, '4': 3, '5': 1 }

2 Comments

I assume units should be arrayOfNums.
@DonaldDuck, yes you're right, thanks for spotting. Have fixed accordingly.
0

You may want to use indexOf() function to find and count each value in array

function g(array,value){
  var n = -1;
  var i = -1;
  do {
    n++;
    i = array.indexOf(value, i+1);
  } while (i >= 0  );

  return n;
}

Comments

0
let countValue = 0;

Array.forEach((word) => {
  if (word === searchValue) {
    return countValue ++;
  }
});
console.log(`The number of word 'asdf': ${countValue}`);

I used this code to count the number of a given word in a text which was previously converted into an array.

Comments

-1
var obj = [];
var array = ['a', 'a', 'a', 'b', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd'];

array.forEach(element => {
  let count = 1;
  array.forEach(loopo => {
    if(element == loopo)
     {
       obj[loopo] = count++;
     }
  })
});
console.log(obj);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.