J. Lynx
J. Lynx

Reputation: 19

Count the number of unique occurrences in an array that contain a specific string with Javascript

Here is my javascript array:

arr = ['blue-dots', 'blue', 'red-dots', 'orange-dots', 'blue-dots'];

With Javascript, how can I count the total number of all unique values in the array that contain the string “dots”. So, for the above array the answer would be 3 (blue-dots, orange-dots, and red-dots).

Upvotes: 1

Views: 164

Answers (8)

1983
1983

Reputation: 5963

I'd separate the operations of string comparison and returning unique items, to make your code easier to test, read, and reuse.

var unique = function(a){
    return a.length === 0 ? [] : [a[0]].concat(unique(a.filter(function(x){
        return x !== a[0];
    })));
};

var has = function(x){
    return function(y){
        return y.indexOf(x) !== -1;
    };
};

var arr = ["blue-dots", "blue", "red-dots", "orange-dots", "blue-dots"];
var uniquedots = unique(arr.filter(has('dots')));
console.log(uniquedots);
console.log(uniquedots.length);

Upvotes: 0

Brandon Anzaldi
Brandon Anzaldi

Reputation: 7270

var arr = [ "blue-dots", "blue", "red-dots", "orange-dots", "blue-dots" ];
var fArr = []; // Empty array, which could replace arr after the filtering is done.
arr.forEach( function( v ) {
  v.indexOf( "dots" ) > -1 && fArr.indexOf( v ) === -1 ? fArr.push( v ) : null;
  // Filter if "dots" is in the string, and not already in the other array.
});

// Code for displaying result on page, not necessary to filter arr

document.querySelector( ".before" ).innerHTML = arr.join( ", " );
document.querySelector( ".after" ).innerHTML = fArr.join( ", " );
Before:
<pre class="before">
  </pre>
After:
<pre class="after">
  </pre>

To put this simply, it will loop through the array, and if dots is in the string, AND it doesn't already exist in fArr, it'll push it into fArr, otherwise it'll do nothing.

Upvotes: 0

Anvesh_vs
Anvesh_vs

Reputation: 394

Try this code,

arr = ["blue-dots", "blue", "red-dots", "orange-dots", "blue-dots"];

sample = [];    
for (var i = 0; i < arr.length; i++) {
    if ((arr[i].indexOf('dots') !== -1) && (sample.indexOf(arr[i]) === -1)){
       sample.push(arr[i]);

    }
 }

alert(sample.length);

Upvotes: 0

Medet Tleukabiluly
Medet Tleukabiluly

Reputation: 11940

var uniqueHolder = {};
var arr = ["blue-dots", "blue", "red-dots", "orange-dots", "blue-dots"];
arr.filter(function(item) {
    return item.indexOf('dots') > -1;
  })
  .forEach(function(item) {
    uniqueHolder[item] ? void(0) : uniqueHolder[item] = true;
  });
console.log('Count: ' + Object.keys(uniqueHolder).length);
console.log('Values: ' + Object.keys(uniqueHolder));

Upvotes: 0

Mauricio Moraes
Mauricio Moraes

Reputation: 7373

From this question, I got the getUnique function.

Array.prototype.getUnique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u.hasOwnProperty(this[i])) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}

then you can add a function that counts ocurrences of a string inside an array of strings:

function getOcurrencesInStrings(targetString, arrayOfStrings){
  var ocurrencesCount = 0;
  for(var i = 0, arrayOfStrings.length; i++){
    if(arrayOfStrings[i].indexOf(targetString) > -1){
      ocurrencesCount++;
    }
  }
  return ocurrencesCount;
}

then you just:

getOcurrencesInStrings('dots', initialArray.getUnique())

This will return the number you want.

It's not the smallest piece of code, but It's highly reusable.

Upvotes: 0

Wikiti
Wikiti

Reputation: 1636

Try this something like this:

// Create a custom function
function countDots(array) {
  var count = 0;

  // Get and store each value, so they are not repeated if present.
  var uniq_array = [];
  array.forEach(function(value) {
    if(uniq_array.indexOf(value) == -1) {
      uniq_array.push(value);

      // Add one to count if 'dots' word is present.
      if(value.indexOf('dots') != -1) {
        count += 1;
      }
    }
  });

  return count;
}

// This will print '3' on console
console.log( countDots(['blue-dots', 'blue', 'red-dots', 'orange-dots', 'blue-dots']) );

Upvotes: 0

Fabricator
Fabricator

Reputation: 12782

One way is to store element as key of an object, then get the count of the keys:

var arr = ["blue-dots", "blue", "red-dots", "orange-dots", "blue-dots"];
console.log(Object.keys(arr.reduce(function(o, x) {
  if (x.indexOf('dots') != -1) {
    o[x] = true;
  }
  return o
}, {})).length)

Upvotes: 1

Serge Eremeev
Serge Eremeev

Reputation: 120

var count = 0,
    arr1 = [];    
for (var i = 0; i < arr.length; i++) {
    if (arr[i].indexOf('dots') !== -1) {
        if (arr1.indexOf(arr[i]) === -1) {
            count++;
            arr1.push(arr[i]);
        }
    }
 }

you check if a certain element contains 'dots', and if it does, you check if it is already in arr1, if not increment count and add element to arr1.

Upvotes: 2

Related Questions