Converting a JS object to an array using jQuery

JavascriptJqueryArraysObject

Javascript Problem Overview


My application creates a JavaScript object, like the following:

myObj= {1:[Array-Data], 2:[Array-Data]}

But I need this object as an array.

array[1]:[Array-Data]
array[2]:[Array-Data]

So I tried to convert this object to an array by iterating with $.each through the object and adding the element to an array:

x=[]
$.each(myObj, function(i,n) {
	x.push(n);});

Is there an better way to convert an object to an array or maybe a function?

Javascript Solutions


Solution 1 - Javascript

If you are looking for a functional approach:

var obj = {1: 11, 2: 22};
var arr = Object.keys(obj).map(function (key) { return obj[key]; });

Results in:

[11, 22]

The same with an ES6 arrow function:

Object.keys(obj).map(key => obj[key])

With ES7 you will be able to use Object.values instead (more information):

var arr = Object.values(obj);

Or if you are already using Underscore/Lo-Dash:

var arr = _.values(obj)

Solution 2 - Javascript

var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

var array = $.map(myObj, function(value, index) {
    return [value];
});


console.log(array);

Output:

[[1, 2, 3], [4, 5, 6]]

Solution 3 - Javascript

Simply do

Object.values(obj);

That's all!

Solution 4 - Javascript

I think you can use for in but checking if the property is not inerithed

myObj= {1:[Array-Data], 2:[Array-Data]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
       arr.push(myObj[i]);
    }
}

EDIT - if you want you could also keep the indexes of your object, but you have to check if they are numeric (and you get undefined values for missing indexes:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

myObj= {1:[1,2], 2:[3,4]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
        if (isNumber(i)){
            arr[i] = myObj[i];
        }else{
          arr.push(myObj[i]);
        }
    }
}

Solution 5 - Javascript

If you know the maximum index in you object you can do the following:

var myObj = {
    1: ['c', 'd'],
    2: ['a', 'b']
  },
  myArr;

myObj.length = 3; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr); //[undefined, ['c', 'd'], ['a', 'b']]

Solution 6 - Javascript

Since ES5 Object.keys() returns an array containing the properties defined directly on an object (excluding properties defined in the prototype chain):

Object.keys(yourObject).map(function(key){ return yourObject[key] });

ES6 takes it one step further with arrow functions:

Object.keys(yourObject).map(key => yourObject[key]);

Solution 7 - Javascript

Nowadays, there is a simple way to do this : Object.values().

var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

console.log(Object.values(myObj));

Output:

[[1, 2, 3], [4, 5, 6]]

This doesn't required jQuery, it's been defined in ECMAScript 2017.
It's supported by every modern browser (forget IE).

Solution 8 - Javascript

The best method would be using a javascript -only function:

var myArr = Array.prototype.slice.call(myObj, 0);

Solution 9 - Javascript

x = [];
for( var i in myObj ) {
    x[i] = myObj[i];
}

Solution 10 - Javascript

ECMASCRIPT 5:

Object.keys(myObj).map(function(x) { return myObj[x]; })

ECMASCRIPT 2015 or ES6:

Object.keys(myObj).map(x => myObj[x])

Solution 11 - Javascript

How about jQuery.makeArray(obj)

This is how I did it in my app.

Solution 12 - Javascript

ES8 way made easy:

The official documentation

    const obj = { x: 'xxx', y: 1 };
    let arr = Object.values(obj); // ['xxx', 1]
    console.log(arr);

Solution 13 - Javascript

The solving is very simple

var my_obj = {1:[Array-Data], 2:[Array-Data]}
Object.keys(my_obj).map(function(property_name){ 
	return my_obj[property_name]; 
});

Solution 14 - Javascript

Fiddle Demo

Extension to answer of bjornd .

var myObj = {
    1: [1, [2], 3],
    2: [4, 5, [6]]
}, count = 0,
    i;
//count the JavaScript object length supporting IE < 9 also
for (i in myObj) {
    if (myObj.hasOwnProperty(i)) {
        count++;
    }
}
//count = Object.keys(myObj).length;// but not support IE < 9
myObj.length = count + 1; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr);


Reference

Array.prototype.slice()

Function.prototype.apply()

Object.prototype.hasOwnProperty()

Object.keys()

Solution 15 - Javascript

If you want to keep the name of the object's properties as values. Example:

var fields = {
    Name: { type: 'string', maxLength: 50 },
    Age: { type: 'number', minValue: 0 }
}

Use Object.keys(), Array.map() and Object.assign():

var columns = Object.keys( fields ).map( p => Object.assign( fields[p], {field:p} ) )

Result:

[ { field: 'Name', type: 'string', maxLength: 50 }, 
  { field: 'Age', type: 'number', minValue: 0 } ]

Explanation:

Object.keys() enumerates all the properties of the source ; .map() applies the => function to each property and returns an Array ; Object.assign() merges name and value for each property.

Solution 16 - Javascript

I made a custom function:

	Object.prototype.toArray=function(){
	var arr=new Array();
	for( var i in this ) {
		if (this.hasOwnProperty(i)){
   			arr.push(this[i]);
		}
	}
	return arr;
};

Solution 17 - Javascript

After some tests, here is a general object to array function convertor:

You have the object:

var obj = {
    some_key_1: "some_value_1"
    some_key_2: "some_value_2"
};

The function:

function ObjectToArray(o)
{
    var k = Object.getOwnPropertyNames(o);
    var v = Object.values(o);
    
    var c = function(l)
    {
        this.k = [];
        this.v = [];
        this.length = l;
    };
    
    var r = new c(k.length);
    
    for (var i = 0; i < k.length; i++)
    {
        r.k[i] = k[i];
        r.v[i] = v[i];
    }
    
    return r;
}

Function Use:

var arr = ObjectToArray(obj);

You Get:

> arr { > key: [ > "some_key_1", > "some_key_2" > ], > value: [ > "some_value_1", > "some_value_2" > ], > length: 2 > }

So then you can reach all keys & values like:

for (var i = 0; i < arr.length; i++)
{
    console.log(arr.key[i] + " = " + arr.value[i]);
}

Result in console:

> some_key_1 = some_value_1 > some_key_2 = some_value_2

Edit:

Or in prototype form:

Object.prototype.objectToArray = function()
{
    if (
        typeof this != 'object' ||
        typeof this.length != "undefined"
    ) {
        return false;
    }
    
    var k = Object.getOwnPropertyNames(this);
    var v = Object.values(this);
    
    var c = function(l)
    {
        this.k = [];
        this.v = [];
        this.length = l;
    };
    
    var r = new c(k.length);
    
    for (var i = 0; i < k.length; i++)
    {
        r.k[i] = k[i];
        r.v[i] = v[i];
    }
    
    return r;
};

And then use like:

console.log(obj.objectToArray);

Solution 18 - Javascript

You can create a simple function to do the conversion from object to array, something like this can do the job for you using pure javascript:

var objectToArray = function(obj) {
  var arr = [];
  if ('object' !== typeof obj || 'undefined' === typeof obj || Array.isArray(obj)) {
    return obj;
  } else {
    Object.keys(obj).map(x=>arr.push(obj[x]));
  }
  return arr;
};

or this one:

var objectToArray = function(obj) {
  var arr =[];
  for(let o in obj) {
    if (obj.hasOwnProperty(o)) {
      arr.push(obj[o]);
    }
  }
  return arr;
};

and call and use the function as below:

var obj = {1:'a', 2:'b', 3:'c', 4:'d', 5:'e'};
objectToArray(obj); // return ["a", "b", "c", "d", "e"]

Also in the future we will have something called Object.values(obj), similar to Object.keys(obj) which will return all properties for you as an array, but not supported in many browsers yet...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThe BndrView Question on Stackoverflow
Solution 1 - JavascriptJoelView Answer on Stackoverflow
Solution 2 - JavascriptDogbertView Answer on Stackoverflow
Solution 3 - JavascriptPilaView Answer on Stackoverflow
Solution 4 - JavascriptNicola PeluchettiView Answer on Stackoverflow
Solution 5 - JavascriptbjorndView Answer on Stackoverflow
Solution 6 - JavascriptMaxdowView Answer on Stackoverflow
Solution 7 - JavascriptStopiView Answer on Stackoverflow
Solution 8 - JavascriptFriedrichView Answer on Stackoverflow
Solution 9 - JavascriptnobodyView Answer on Stackoverflow
Solution 10 - JavascriptAditya SinghView Answer on Stackoverflow
Solution 11 - JavascriptSankalp SinghaView Answer on Stackoverflow
Solution 12 - JavascriptBlack MambaView Answer on Stackoverflow
Solution 13 - JavascriptIvan FretesView Answer on Stackoverflow
Solution 14 - JavascriptTushar Gupta - curioustusharView Answer on Stackoverflow
Solution 15 - JavascriptSupersharpView Answer on Stackoverflow
Solution 16 - JavascriptmailmindlinView Answer on Stackoverflow
Solution 17 - JavascriptKostasView Answer on Stackoverflow
Solution 18 - JavascriptAlirezaView Answer on Stackoverflow