24

I'm fairly new to JavaScript and am not sure this is possible to do but basically I would like to take an object and convert it into an array of strings in the format; array[0] = 'prop1=value1'

The reasoning behind this is that I'm having a user enter a list of k=v pairs into a form, later it's written as an object within a json blob. Going from the key value csl to the json object was simple, now I need to go back the other way (I've received the JSON via an ajax call and want to populate a blank form). Is this possible in JavaScript? If not please offer a reasonable work around.

Sample code;

Object in debugger;

 Object
        private_key: "private-key"
        public_key: "public-key"

I need to convert that to;

 "private_key=private-key,public_key=public-key"

Basically I need something like this (pseudo code)

var outputString = '';
foreach (prop in obj)
{
    outputString = outputString + prop.tostring() + '=' + prop.value + ',';
}
6
  • Is there any reason why you aren't using JSON.parse() and JSON.stringify()? Commented Jan 30, 2013 at 23:17
  • "Going from the key value csl" - What is CSL? Commented Jan 30, 2013 at 23:18
  • Before this happens I've used JSON.parse() to get an object from the json. The problem is in displaying the property names and not just their values. Commented Jan 30, 2013 at 23:19
  • @stevebot comma separated list Commented Jan 30, 2013 at 23:20
  • @evanmcdonnal: If you have found key-value-csl -> object to be simple, the reverse should be trivial as well? What have you tried, where are you stuck? Commented Jan 30, 2013 at 23:22

7 Answers 7

42

You're probably looking for something along the lines of

var obj = {value1: 'prop1', value2: 'prop2', value3: 'prop3'};
var arr = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        arr.push(key + '=' + obj[key]);
    }
};
var result = arr.join(',');
alert(result);

Notice that it will work fine if your values are strings; if they're complex objects then you'll need to add more code.

Or you can just use jQuery.param, which does what you want, even for complex types (although it uses the & character as the separator, instead of the comma.

Sign up to request clarification or add additional context in comments.

1 Comment

If you want to convert your object into a request query then using jQuery.params is always recommended over error prone, custom code.
5

In ES6 you can use Object.entries({object1:1,object2:2});. The result is: [["object1",1],["object2",2]]

Comments

4
var array = [];
for (k in o)
{
    if (o.hasOwnProperty(k))
    {
        array.push(k+"="+o[k]);
    }
}

You can then join the array for your final string.

Comments

4
var object = {
    private_key: "private-key",
    public_key: "public-key"
};

var array = [];
for (var prop in object)
    array.push(prop + "=" + object[prop]);
return array.join(','); // "private_key=private-key,public_key=public-key"

Notice the order is not guaranteed.

5 Comments

It is guaranteed....just in alphabetical order instead of placed order.
@GoldBishop Nope, it's not. If you want alphabetic order, do array.sort().join(',').
Maybe its happen-stance, but it has been pretty reliable for me without using sort. But i also usually go from Object -> Array -> String or just Object -> String.
Yes, it seems to be happen-stance. You cannot rely on it, but most implementations do keep definition order (I haven't heard of an alphabetic one).
Could also be that Chrome applies its own sort when inspecting the various Types.
2

obj = {
  private_key: "private-key",
  public_key: "public-key"
}

str = JSON.stringify(obj).replace(/[{}]/g, '').replace(/"/g, '').replace(/:/g, '=');
console.log("Using JSON.stringify:\n", str);

str = Object.keys(obj).map((key) => `${key}=${obj[key]}`).join(',')
console.log("Using ES6 keys/map:\n", str);

str = jQuery.param(obj).replace(/&/g,',');
console.log("Using jQuery.param:\n", str);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Comments

2
var obj =[
            {'2018-05-07':1},
            {'2018-05-08':3},
            {'2018-05-09':2}
        ];

        for(var i of obj) {
            var key = Object.keys(i).toString();
            console.log(i,'=',i[key]);
        }

Result

: enter image description here

Comments

0

1-liner:

Object.entries(yourObj).map(e => ({ name: e[0], value: e[1] }));

Example use:

let yourObj = { foo: "bar", baz: "bas" };

// turn object properties into array entries
let array = Object.entries(yourObj).map(e => ({ name: e[0], value: e[1] }));

// returns
array = [
  { name: "foo", value: "bar" },
  { name: "baz", value: "bas" },
]
// loop over it
for (let prop of array) {
  console.log(prop.name, "=", prop.value);
}
// shows
foo = bar
baz = bas

Alternatively, create string in the format you wanted:

Object.entries(yourObj).map(e => e[0] + "=" + e[1]).join(",");
"foo=bar,baz=bas"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.