104

This is my Object

var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

This is the output that I expect

data = [ 
    {"0": "1"},
    {"1": "2"},
    {"2": "3"},
    {"3": "4"}
]
Nick Div
  • 5,338
  • 12
  • 65
  • 127
  • Then see my comment about the target structure. It's a bad output format and a pain to use in javascript. Why not just put all key/value pairs in a single object? – jfriend00 Nov 07 '14 at 06:54
  • 1
    I am using a third party library in my application that needs the input in the format that i want. cant help it. – Nick Div Nov 07 '14 at 06:55
  • 2
    Wow, these comments make my head hurt. How is an array of objects "a pain to use in javascript"? Granted the objects are normally all the same structure, but we use arrays of objects all the time, quite painlessly. – iGanja Oct 31 '17 at 17:07

12 Answers12

138

This works for me

var newArrayDataOfOjbect = Object.values(data)

In additional if you have key - value object try:

const objOfObjs = {
   "one": {"id": 3},
   "two": {"id": 4},
};

const arrayOfObj = Object.entries(objOfObjs).map((e) => ( { [e[0]]: e[1] } ));

will return:

[
  {
    "one": {
      "id": 3
    }
  },
  {
    "two": {
      "id": 4
    }
  }
]
itsazzad
  • 6,868
  • 7
  • 69
  • 89
Thierry
  • 1,626
  • 1
  • 13
  • 10
55
var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

var myData = Object.keys(data).map(key => {
    return data[key];
})

This works for me

Shuwei
  • 774
  • 6
  • 7
11

The accepted answer doesn't take into account the OP wanted to get rid of the keys. This returns only the objects, not their parent key.

Object.entries(ObjOfObjs).map(e => e[1]) outputs:

[ 
  {"0": "1"},
  {"1": "2"},
  {"2": "3"},
  {"3": "4"}
]
Matt Weber
  • 2,808
  • 2
  • 14
  • 30
7

You can easily do this by using Object.values() function

var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

console.log(Object.values(data))
Bisma Azher
  • 689
  • 8
  • 9
5

You would have to give a name to each value in the object.

Once you fix the first object, then you can do it using push.

var data = {
    1: {"0": "1"},
    2: {"1": "2"},
    3 : {"2": "3"},
    4: {"3": "4"}
};

var ar = [];
for(item in data){
    ar.push(data[item]);
 }

console.log(ar);

http://jsfiddle.net/nhmaggiej/uobrfke6/

mags
  • 590
  • 1
  • 8
  • 25
  • I was thinking if there was another way rather than looping the whole Object. Because I have like a thousand records. But if there is nothing else that will work then I can use this. Thanks.. – Nick Div Nov 07 '14 at 06:57
2

this is simple and will do in an immutable way so that your main data not touched but you can create a new mappedData as per your requirement and create a new array.

let data = {
  a: { "0": "1" },
  b: { "1": "2" },
  c: { "2": "3" },
  d: { "3": "4" }
};

const mappedDataArray = [];

for (const key in data) {
  const mappedData = {
    ...data[key]
  };
  mappedDataArray.push(mappedData);
}

console.log(mappedDataArray);
console.log(data);
1
var array = [];
for(var item in data){
    // this condition is required to prevent moving forward to prototype chain
    if(data.hasOwnProperty(item)){
        array.push(data[item]);
    } 
}
frogatto
  • 28,539
  • 11
  • 83
  • 129
1

Finally, It works for me to convert from object to array of objects when you get object value from

       const snapshortObject = snapshot.val(); //  And they look like this are stored value.

  let snapshortObject = {
      a: { 
            message: "Hiiii",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:18 2022"
      },
      b: { 
            message: "Hiiii",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:18 2022"
      },
      c: { 
            message: "Hello ",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:50 2022"
      },
      d: { 
            message: "Hello ",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:50 2022"
      }
    };
    
    const mappedDataArray = [];
    slno=1
    for (const key in snapshortObject) {
      const mappedData = {
        ...snapshortObject[key],
        slno:slno++
      };
      mappedDataArray.push(mappedData);
    }
    console.log(mappedDataArray);

1

Willie Cheng
  • 7,679
  • 13
  • 55
  • 68
Gourav
  • 31
  • 2
0

I get what you want ! Here is your solution,

var dataObject=[{name:'SrNo',type:'number'}];

And to access or store the array use

dataObject[0].srno=1;
dataObject[0].srno=2;

Hope this is what you needed.

frogatto
  • 28,539
  • 11
  • 83
  • 129
0

This worked for me. And it seems to be well supported.

toArray(obj_obj) {
    return Object.keys(obj_obj).map(i => obj_obj[i]);
}

https://medium.com/chrisburgin/javascript-converting-an-object-to-an-array-94b030a1604c

Omar
  • 2,726
  • 2
  • 32
  • 65
0

We can use Object default methods (Object.assign(), Object.values()) to convert Object of Object to array in the following way

const ObjValue = {
a:{"0": "1"},
b:{"1": "2"},
c:{"2": "3"},
d:{"3": "4"}
}
const ObjtoArray = (obj) => Object.assign([], Object.values(obj))

console.log(ObjtoArray(ObjValue))
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133
0

Easy Hack

  var data = {
        a:{"0": "1"},
        b:{"1": "2"},
        c:{"2": "3"},
        d:{"3": "4"}
    };

 data = Object.values(data).map((item)=>item)
console.log(data)
Mirza Hayat
  • 284
  • 5
  • 11