JS array with getter by ID ?
JS array with getter by ID ?
Hi !
Given the following sample items :
ID | First name | Age |
---|---|---|
xvZwiCpi | Naomi | 42 |
Nzd9UsGT | Naomi | 24 |
QiDXP2wA | Thea | 53 |
JpYeAY7H | Jeremy | 35 |
I can store these in an array :
js
const data = [ { id: 'xvZwiCpi', firstName: 'Frederic', age: 42 }, { id: 'Nzd9UsGT', firstName: 'Naomi', age: 24 }, { id: 'QiDXP2wA', firstName: 'Thea', age: 53 }, { id: 'JpYeAY7H', firstName: 'Mathew', age: 35 } ];
Thus access them the same way by ID :
js
console.log(data.find(item => item.id === 'xvZwiCpi'));
And by properties :
js
console.log(data.find(item => item.firstName === 'Frederic').id);
Or I can store these in an object :
js
const data = { 'xvZwiCpi': { firstName: 'Frederic', age: 42 }, 'Nzd9UsGT': { firstName: 'Naomi', age: 24 }, 'QiDXP2wA': { firstName: 'Thea', age: 53 }, 'JpYeAY7H': { firstName: 'Mathew', age: 35 } };
Thus more easily access properties by ID :
js
console.log(data['xvZwiCpi'].firstName);
But more hardly access ID by properties :
js
console.log(Object.entries(data).find(([id, item]) => item.firstName = 'Frederic')[0]);
I could duplicate IDs :
js
const data = { 'xvZwiCpi': { id: 'xvZwiCpi', firstName: 'Frederic', age: 42 }, 'Nzd9UsGT': { id: 'Nzd9UsGT', firstName: 'Naomi', age: 24 }, 'QiDXP2wA': { id: 'QiDXP2wA', firstName: 'Thea', age: 53 }, 'JpYeAY7H': { id: 'JpYeAY7H', firstName: 'Mathew', age: 35 } };
To slightly simplify that previous line :
js
console.log(Object.values(data).find(item => item.firstName = 'Frederic').id);
But what if a single variable type could allow doing both operations easily ?
js
console.log(data['xvZwiCpi'].firstName); console.log(data.find(item => item.firstName === 'Frederic').id);
Does that exist ?
If not, I'm thinking about implementing it that way :
js
const data = new Proxy([ { id: 'xvZwiCpi', firstName: 'Frederic', age: 42 }, { id: 'Nzd9UsGT', firstName: 'Naomi', age: 24 }, { id: 'QiDXP2wA', firstName: 'Thea', age: 53 }, { id: 'JpYeAY7H', firstName: 'Mathew', age: 35 } ], { get: (array, property) => array[property] || array.find(item => item.id === property) });
In which case I'd put it in a lib, but how would this be named ?
I'd also make a second implementation that would enforce ID uniqueness and use Map
to map IDs with indexes instead of running find
: while the first implementation would be fine for static data, the second one would be more suitable for dynamic data.
Would this make sense ?
Thanks