Jake
Jake

Reputation: 26107

JavaScript - Converting URL like string params to an array

I have a string like this:

var str = 'My_Type_1=SSD&My_Value_1=16GB&My_Category_1=Disk Capacity&My_Type_2=Sony
&My_Value_2=PS4&My_Category_2=Console&My_rowOrder=2,1';

The string mostly has 3 parts except the last key:
Part 1 -> My - is a Common Prefix
Part 2 -> Type or Value or Category and it can keep changing
Part 3 -> It's a numeric value binding Part 1, Part 2 and Part 3 like Spreadsheet row.

The last key is always called My_rowOrder and it's a comma delimeted value. It specifies how to construct the output array.

In the above example, 2,1 means a key value pair of My_Type_2=Sony&My_Value_2=PS4&My_Category_2=Console should be the first in the output array.

Using JavaScript, I would like to parse the string and create an array out of it, such that the output is:

Array
(
    [ 0 ] => Array
        (
            [Type] => Sony
            [Value] => PS4
            [Category] => Console
            [Row] => 2
        )

    [ 1 ] => Array
        (
            [Type] => SSD
            [Value] => 16GB
            [Category] => Disk Capacity
            [Row] => 1
        )  
)

How can I do this? I am partially able to do it this way:

function StringToArray(string) {
          var request = {};
          var pairs = string.split('&');
          for (var i = 0; i < pairs.length-1; i++) {
            var pair = pairs[i].split('=');
            request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
          }
          //I think I am in the right track, but need assistance
    }

Upvotes: 0

Views: 157

Answers (3)

MrCode
MrCode

Reputation: 64526

Your example output uses associative arrays, which JavaScript doesn't have, but you can use an array of objects instead.

This example outputs an array of objects, in the order specified by the rowOrder parameter. It trims the prefix (defined by prefix), and also trims the row number from the end of the key.

This will also work with the parameters in any order - e.g. you can mix them and it will parse as necessary, and the rowOrder parameter can appear anywhere in the string (doesn't have to be at the end).

Demo

function StringToArray(string) {
    var prefix = 'My_'; // set the prefix
    var output = [], request = [];
    var pairs = string.split('&');
    var order;
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');

        if (pair[0].replace(prefix, '') == 'rowOrder') {
            order = pair[1];
        } else {
            var key = decodeURIComponent(pair[0]);
            var pos = key.lastIndexOf('_');
            var trimmedKey = key.substring(0, pos).replace(prefix, '');
            var row = key.substring(pos + 1);
            var value = decodeURIComponent(pair[1]);
            var found = false;

            for (var j = 0; j < output.length; j++) {
                if (output[j].Row == row) {
                    output[j][trimmedKey] = value;
                    found = true;
                }
            }

            if (!found) {
                var obj = { 'Row': row };
                obj[trimmedKey] = value;
                output.push(obj);
            }
        }
    }
    // do the ordering based on the rowOrder parameter
    var orderList = order.split(",");
    for(var k=0; k<orderList.length; k++){
        for(var l=0; l<output.length; l++){
            if(output[l].Row == orderList[k]){
                request.push(output[l]);
                break;
            }
        }
    }

    return request;
}

Outputs an array of objects in the order specified by the My_rowOrder parameter:

[
    {
        Row: "2",
        Type: "Sony",
        Value: "PS4",
        Category: "Console"
    },
    {
        Row: "1",
        Type: "SSD",
        Value: "16GB",
        Category: "Disk Capacity"
    }
]

Upvotes: 1

Simon H
Simon H

Reputation: 21005

Try this:

function StringToArray(string) {
          var request = [[],[]];
          var pairs = string.split('&');
          for (var i = 0; i < pairs.length; i++) {
            var pair = pairs[i].split('=');
            request[pair[0].slice(-1)-1][decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
          }
          //console.log(request)
    }

Upvotes: 0

Rahul K
Rahul K

Reputation: 413

This may works for you...

<script>
var data = "My_Type_2=Sony&My_Value_2=PS4&My_Category_2=Console";
var array = new Array();
alert(JSON.stringify(URLToArray(data)));
function URLToArray(url) {
  var request = {};
  var pairs = url.substring(url.indexOf('?') + 1).split('&');
  for (var i = 0; i < pairs.length; i++) {
    var pair = pairs[i].split('=');
    request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
  }
  return request;
}
</script>

Upvotes: 0

Related Questions