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
};
});
-
possible duplicate of How to get a subset of a javascript object's propertiesartm– artm2015年06月05日 11:09:25 +00:00Commented Jun 5, 2015 at 11:09
-
1@artm, that question is about one object, while I'm asking about an array of objects.vitaly-t– vitaly-t2015年06月05日 11:13:01 +00:00Commented Jun 5, 2015 at 11:13
-
@Khalid, that question doesn't cover sub-set of properties.vitaly-t– vitaly-t2015年06月05日 11:13:16 +00:00Commented Jun 5, 2015 at 11:13
-
Well, you could use stackoverflow.com/a/17781590/3309109 for example and call it for each object in your array.artm– artm2015年06月05日 11:16:33 +00:00Commented Jun 5, 2015 at 11:16
3 Answers 3
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 }]
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' }
]
-
1That'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– vitaly-t2015年06月05日 11:26:11 +00:00Commented Jun 5, 2015 at 11:26
Performance-wise, that would be the most efficient way to do it, yes.
-
Thank you! I did an update after the first answer, which gives a very good and more generic approach.vitaly-t– vitaly-t2015年06月05日 11:29:04 +00:00Commented Jun 5, 2015 at 11:29