7

What is the most efficient way in JavaScript to clone an array of uniform objects into one with a subset of properties for each object?

UPDATE

Would this be the most efficient way to do it or is there a better way? -

var source = [
    {
        id: 1,
        name: 'one',
        value: 12.34
    },
    {
        id: 2,
        name: 'two',
        value: 17.05
    }
];

// copy just 'id' and 'name', ignore 'value':
var dest = source.map(function (obj) {
    return {
        id: obj.id,
        name: obj.name
    };
});
vitaly-t
  • 24,279
  • 15
  • 116
  • 138
  • possible duplicate of [How to get a subset of a javascript object's properties](http://stackoverflow.com/questions/17781472/how-to-get-a-subset-of-a-javascript-objects-properties) – artm Jun 05 '15 at 11:09
  • 1
    @artm, that question is about one object, while I'm asking about an array of objects. – vitaly-t Jun 05 '15 at 11:13
  • @Khalid, that question doesn't cover sub-set of properties. – vitaly-t Jun 05 '15 at 11:13
  • Well, you could use http://stackoverflow.com/a/17781590/3309109 for example and call it for each object in your array. – artm Jun 05 '15 at 11:16

3 Answers3

10

using Object Destructuring and Property Shorthand

let array = [{ a: 5, b: 6, c: 7 }, { a: 8, b: 9, c: 10 }];
let cloned = array.map(({ a, c }) => ({ a, c }));

console.log(cloned); // [{ a: 5, c: 7 }, { a: 8, c: 10 }]
Ivan Nosov
  • 15,395
  • 2
  • 16
  • 14
2

First define a function that clone an object and return a subset of properties,

Object.prototype.pick = function (props) {
   return  props.reduce((function (obj, property) {
        obj[property] = this[property];
        return obj;
   }).bind(this), {});
}

Then define a function that clone an array and return the subsets of each object

function  cloneArray (array, props) { 
    return array.map(function (obj) { 
       return obj.pick(props);
    });
}

Now let's say you have this array :

var array = [
   { name : 'khalid', city : 'ifrane', age : 99 },
   { name : 'Ahmed', city : 'Meknes', age : 30 }
];

you need to call the function and pass the array of properties you need to get as result

cloneArray(array, ['name', 'city']);

The result will be :

[
   { name : 'khalid', city : 'ifrane' },
   { name : 'Ahmed', city : 'Meknes' }
]
Khalid
  • 4,730
  • 5
  • 27
  • 50
  • 1
    That's even more generic an answer than I was looking for, i.e. I didn't mind specifying columns during the copy operation. Your answer is more reusable and clean. Thank you! – vitaly-t Jun 05 '15 at 11:26
1

Performance-wise, that would be the most efficient way to do it, yes.

rrowland
  • 2,734
  • 2
  • 17
  • 32
  • Thank you! I did an update after the first answer, which gives a very good and more generic approach. – vitaly-t Jun 05 '15 at 11:29