Implement a function in JavaScript that given an array of strings representing the domains, counts the number of occurrences of each string as a substring in the whole array and returns it.
Input: const URLs = [ "www.google.com", "www.learnersbucket.com", "google.com", "learnersbucket.com", "news.learnersbucket.com", ]; Output: { "www.google.com": 1, "www.learnersbucket.com": 1, "google.com": 2, "learnersbucket.com": 3, "news.learnersbucket.com": 1 }
We can solve this problem by using the Array.reduce()
and String.includes()
.
- Iterate all the strings and check if the current string is a substring of any other string in the array.
- Count the number of occurrences and then store the count on the string in the result object.
const aggregate = URLs.reduce((acc, currStr, index, array) => { // to track the count of occurrences of the current string let count = 0; // check if the current string is a substring // of any of the strings in the given URL array // use the Boolean method to convert the boolean value to numerical. // 1 for true and 0 for false array.forEach((url) => (count += Boolean(url.includes(currStr)))); // update the count for the string acc[currStr] = count; // return the object return acc; }, {});
Input: const URLs = [ "www.google.com", "www.learnersbucket.com", "xyz.www.google.com", "abc.xyz.www.google.com", "google.com", "learnersbucket.com", "practice.learnersbucket.com", "abc.news.learnersbucket.com", "abc.xyz.www.google.com", "www.learnersbucket.com", "google.com", ]; console.log(aggregate); Output: { "www.google.com": 4, "www.learnersbucket.com": 2, "xyz.www.google.com": 3, "abc.xyz.www.google.com": 2, "google.com": 6, "learnersbucket.com": 5, "practice.learnersbucket.com": 1, "abc.news.learnersbucket.com": 1 }