简体   繁体   中英

JavaScript: convert objects to array of objects

I have thousands of legacy code that stores array information in a non array.

For example:

container.object1 = someobject;
container.object2 = someotherobject;
container.object3 = anotherone;

What I want to have is:

container.objects[1], container.objects[2], container.objects[3] etc.

The 'object' part of the name is constant. The number part is the position it should be in the array.

How do I do this?

Assuming that object1, object2, etc... are sequential (like an array), then you can just iterate through the container object and find all the sequential objectN properties that exist and add them to an array and stop the loop when one is missing.

container.objects = [];  // init empty array
var i = 1;
while (container["object" + i]) {
    container.objects.push(container["object" + i]);
    i++;
}

If you want the first item object1 to be in the [1] spot instead of the more typical [0] spot in the array, then you need to put an empty object into the array's zeroth slot to start with since your example doesn't have an object0 item.

container.objects = [{}];  // init array with first item empty as an empty object
var i = 1;
while (container["object" + i]) {
    container.objects.push(container["object" + i]);
    i++;
}

An alternate way to do this is by using keys .

var unsorted = objectwithobjects;
var keys = Object.keys(unsorted);
var items = [];
for (var j=0; j < keys.length; j++) {
  items[j] = unsorted[keys[j]];
}

You can add an if-statement to check if a key contains 'object' and only add an element to your entry in that case (if 'objectwithobjects' contains other keys you don't want).

That is pretty easy:

var c = { objects: [] };

for (var o in container) {
    var n = o.match(/^object(\d+)$/);
    if (n) c.objects[n[1]] = container[o];
}

Now c is your new container object, where c.object[1] == container.object1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM