• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 129
  • Last Modified:

Fixing Array to be in order of most occurances and alphabetical

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
flfmmqp
Asked:
flfmmqp
  • 6
  • 5
1 Solution
 
GaryCommented:
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
 
flfmmqpAuthor Commented:
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
 
GaryCommented:
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
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

 
flfmmqpAuthor Commented:
I need to call it though.  I am grabbing the values from another spot.  They will not be hard coded
0
 
flfmmqpAuthor Commented:
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
 
GaryCommented:
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
 
flfmmqpAuthor Commented:
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
 
GaryCommented:
What is that supposed to mean to me?
0
 
flfmmqpAuthor Commented:
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
 
flfmmqpAuthor Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

  • 6
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now