Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Fixing Array to be in order of most occurances and alphabetical

Posted on 2014-03-12
11
Medium Priority
?
117 Views
Last Modified: 2014-03-13
Below you find code that I am using to group together values and find how many times it occured.  However, the format it is coming out is not what I would like.  

I am getting this:
John,Paul,Peter,2,4,2

I would like to get it like this:
Paul (4)
John (2)
Peter (2)

Basically in order of most occurnaces and then alphabetical if possible with the number or occurances in ().  

foo(["John","Paul","Peter","Peter","Paul","Paul","Paul","John"])

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 + );
    return [a, b];
}

Open in new window

0
Comment
Question by:flfmmqp
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 5
11 Comments
 
LVL 58

Expert Comment

by:Gary
ID: 39924448
var testArray = new Array("John","Paul","Peter","Peter","Paul","Paul","Paul","John")
testArray.sort()
var newArray = compressArray(testArray);

console.log(newArray)
function compressArray(original) {
    var sorted = [];
    current=""
    count=1
	for (var i = 0; i < original.length; i++) {
         if(current==original[i]){
            count++
        }       
        
        if((current!=original[i]&&current!="")||i==original.length-1){
			var a = new Object();
			a.value = original[i-1];
			a.count = count;
			sorted.push(a);
            count=1
        }
        current=original[i]
 	}
sorted.sort(function(a,b) {
    return  a.count-b.count;
});
	return sorted;
};

Open in new window

0
 

Author Comment

by:flfmmqp
ID: 39924497
I'm pretty new to Javascript.  How should I call this?  I've tried a few different approaches but am getting undefined errors.  I thought this would work.  

I am using this in a html page using IE9 if that makes a differences.  Do I need anything special in my script to use the Console.log  piece?

foo(["John","Paul","Peter","Peter","Paul","Paul","Paul","John"])


function foo(testArray) {
//var testArray = new Array("John","Paul","Peter","Peter","Paul","Paul","Paul","John")
		testArray.sort()
		var newArray = compressArray(testArray);
		
		console.log(newArray)
		function compressArray(original) {
			var sorted = [];
			current=""
			count=1
			for (var i = 0; i < original.length; i++) {
				 if(current==original[i]){
					count++
				}       
				
				if((current!=original[i]&&current!="")||i==original.length-1){
					var a = new Object();
					a.value = original[i-1];
					a.count = count;
					sorted.push(a);
					count=1
				}
				current=original[i]
			}
		sorted.sort(function(a,b) {
			return  a.count-b.count;
		});
			return sorted;
		}; 
}

Open in new window

0
 
LVL 58

Expert Comment

by:Gary
ID: 39924514
Why are you nesting the functions?  Just use the code I posted.

In Developer Tools (F12) you should see the Console tab (cannot remember the layout).
The console.log is just there for testing so you can see the returned array, it can be removed
0
The top UI technologies you need to be aware of

An important part of the job as a front-end developer is to stay up to date and in contact with new tools, trends and workflows. That’s why you cannot miss this upcoming webinar to explore the latest trends in UI technologies!

 

Author Comment

by:flfmmqp
ID: 39924526
I need to call it though.  I am grabbing the values from another spot.  They will not be hard coded
0
 

Author Comment

by:flfmmqp
ID: 39924537
I'm not getting any values.  Just this:

[object Object],[object Object],[object Object],[object Object]

Even using this - var testArray = new Array("John","Paul","Peter","Peter","Paul","Paul","Paul","John")
0
 
LVL 58

Expert Comment

by:Gary
ID: 39924541
Call what
All you need to do is pass the array to the function

var testArray = ["John","Paul","Peter","Peter","Paul","Paul","Paul","John"]
testArray.sort()

var newArray = compressArray(testArray);
...
...

Open in new window


http://jsfiddle.net/GaryC123/rfW6x/3/
0
 

Author Comment

by:flfmmqp
ID: 39924555
A little more info:

        function selectInBuffer(response){
          var feature;
          var features = response.features;
          var inBuffer = [];
          //filter out features that are not actually in buffer, since we got all points in the buffer's bounding box
          for (var i = 0; i < features.length; i++) {
            feature = features[i];
            if(circle.contains(feature.geometry)){
              inBuffer.push(feature.attributes[featureLayer.objectIdField]);
            }
          }
          var query = new Query();
          query.objectIds = inBuffer;
          //use a fast objectIds selection query (should not need to go to the server)
          featureLayer.selectFeatures(query, FeatureLayer.SELECTION_NEW, function(results){
            var r = "";
            r = "5 Mile Aggregate Browser:" +"<br> Retailer Summary: " + GetUnique(results) + "<BR> Unigue arrary: " + [b]compressArray(testArray[/b]);
            dom.byId("messages").innerHTML = r;
          });
        }


		var testArray = new Array("John","Paul","Peter","Peter","Paul","Paul","Paul","John")
		testArray.sort()
		var newArray = compressArray(testArray);
		
		//console.log(newArray)
		function compressArray(original) {
			var sorted = [];
			current=""
			count=1
			for (var i = 0; i < original.length; i++) {
				 if(current==original[i]){
					count++
				}       
				
				if((current!=original[i]&&current!="")||i==original.length-1){
					var a = new Object();
					a.value = original[i-1];
					a.count = count;
					sorted.push(a);
					count=1
				}
				current=original[i]
			}
		sorted.sort(function(a,b) {
			return  a.count-b.count;
		});
			return sorted;
		}; 

Open in new window

0
 
LVL 58

Expert Comment

by:Gary
ID: 39924567
What is that supposed to mean to me?
0
 

Author Comment

by:flfmmqp
ID: 39924570
BTW this is not coming out how I was hoping.  That alert box is not coming out like this order or looking like this:

I would like to get it like this:
Paul (4)
John (2)
Peter (2)


Thanks for trying to help.  But currently the result does not look much different then what I already have posted code for.
0
 
LVL 58

Accepted Solution

by:
Gary earned 2000 total points
ID: 39924589
0
 

Author Closing Comment

by:flfmmqp
ID: 39926031
I'm awarding the points as I think you answered my question here for me.  However, I'm not completely done with this project.  So if you would like to take a crack at my last issue with that here is the link to my next question.   Thanks for all of your help.
 
http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_28387540.html
0

Featured Post

Build and deliver software with DevOps

A digital transformation requires faster time to market, shorter software development lifecycles, and the ability to adapt rapidly to changing customer demands. DevOps provides the solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Find out what you should include to make the best professional email signature for your organization.
Q&A with Course Creator, Mark Lassoff, on the importance of HTML5 in the career of a modern-day developer.
In this tutorial viewers will learn how add a scalable full-width header using CSS3. Create a new HTML document with an internal stylesheet. Set a tiled background.:  Create a new div and name it Header. Position it with position:absolute at the top…
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question