I am writing the following code which specified the attribute must return it even if it is of type obj, array, string or number.
I'm having some problems getting me back certain attributes going even deeper.
I would like to do this without using external modules.
Can you give me some advice?
function returnElement(obj, label) {
let pointBool = label.includes(".");
let arrayOpenBool = label.includes("[");
let arrayCloseBool = label.includes("]");
//console.log(obj, label,arrayOpenBool && arrayCloseBool);
if (arrayOpenBool && arrayCloseBool) {
let start = label.split("[")[0];
let number = label.split("[")[1].split("]")[0];
let end = label.split("]")[0];
if (label.includes(".")) end = label.split(".")[1];
return obj[start][number]
? returnElement(obj[start][number], end)
: undefined;
}
if (pointBool) {
let start = label.split(".")[0];
let end = label.split(".")[1];
//console.log(obj, label, start, end, obj[end]);
if (start === "") return obj[end];
return returnElement(obj[start], end);
}
return obj[label];
}
var a = {
_id: "5d406a179f35ed326a6a5567",
age: 28,
name: {first: "James",last: "Bond"},
user: [{first: "Jon",last: "Witch"},{first: "Myra",last: "Navarro",number:[0,10]}]
};
var b = [];
b.push("item");//undefined
b.push("_id");//5d406a179f35ed326a6a5567
b.push("age");//28
b.push("name.first");//James
b.push("user[1]");//obj{}
b.push("user[1].first");//Myra
b.push("user[2].first");//undefined
b.push("user[1].email");//undefined
b.push("user[0].number");//[0, 1]
b.push("user[1].number[1]");//1
b.forEach(el => {
console.log(returnElement(a, el));
})
Edit:
Here is an additional thing, given the solution proposed by @NinaScholz, it allows you to sort the data you more parameters, if it can be of use to someone.
based on the following solution: Link
let datatable = [
{
_id: '5d406a171ed43384972f04b5',
index: 0,
age: 28,
eyeColor: 'brown',
name: {
first: 'Myra',
last: 'Navarro',
},
company: 'SUSTENZA',
email: 'myra.navarro@sustenza.net',
},
{
_id: '5d406a170db0f4b04d9a9acf',
index: 1,
age: 23,
eyeColor: 'blue',
name: {
first: 'Harriett',
last: 'Tanner',
},
company: 'VALPREAL',
email: 'harriett.tanner@valpreal.com',
},
{
_id: '5d406a17e95da8ff80a759c5',
index: 2,
age: 39,
eyeColor: 'blue',
name: {
first: 'Vega',
last: 'Hanson',
},
company: 'BEDLAM',
email: 'vega.hanson@bedlam.tv',
},
{
_id: '5d406a175505da190e6875ec',
index: 3,
age: 31,
eyeColor: 'blue',
name: {
first: 'Rosemary',
last: 'Fields',
},
company: 'QUAILCOM',
email: 'rosemary.fields@quailcom.me',
},
{
_id: '5d406a17ea96044c027f4e50',
index: 4,
age: 27,
eyeColor: 'brown',
name: {
first: 'Dale',
last: 'Wilkinson',
},
company: 'QIAO',
email: 'dale.wilkinson@qiao.org',
},
{
_id: '5d406a17c5fff1ff6653a555',
index: 5,
age: 25,
eyeColor: 'blue',
name: {
first: 'Beatrice',
last: 'Contreras',
},
company: 'ZENOLUX',
email: 'beatrice.contreras@zenolux.us',
},
{
_id: '5d406a17a199efcba25e1f26',
index: 6,
age: 34,
eyeColor: 'blue',
name: {
first: 'Hancock',
last: 'Wynn',
},
company: 'PLASMOS',
email: 'hancock.wynn@plasmos.co.uk',
},
{
_id: '5d406a17019a2a4544a4f134',
index: 7,
age: 40,
eyeColor: 'blue',
name: {
first: 'Beatrice',
last: 'Aston',
},
company: 'SNACKTION',
email: 'beatrice.aston@snacktion.name',
},
{
_id: '5d406a17e516dd71af8210d4',
index: 8,
age: 39,
eyeColor: 'blue',
name: {
first: 'Barnes',
last: 'Dunn',
},
company: 'PORTALINE',
email: 'barnes.dunn@portaline.ca',
},
{
_id: '5d406a17516936a025b73c33',
index: 9,
age: 34,
eyeColor: 'green',
name: {
first: 'Blanche',
last: 'Cherry',
},
company: 'ISOSWITCH',
email: 'blanche.cherry@isoswitch.io',
},
{
_id: '5d406a17527a4d2c6a7897dd',
index: 10,
age: 33,
eyeColor: 'blue',
name: {
first: 'Gilliam',
last: 'Farley',
},
company: 'AMTAS',
email: 'gilliam.farley@amtas.biz',
},
{
_id: '5d406a175ff11478c416c30b',
index: 11,
age: 26,
eyeColor: 'brown',
name: {
first: 'Laura',
last: 'Short',
},
company: 'FISHLAND',
email: 'laura.short@fishland.info',
},
{
_id: '5d406a1738181b471847339a',
index: 12,
age: 20,
eyeColor: 'brown',
name: {
first: 'Moreno',
last: 'Barber',
},
company: 'KEENGEN',
email: 'moreno.barber@keengen.net',
},
{
_id: '5d406a17a6bcae6fe3ad1735',
index: 13,
age: 30,
eyeColor: 'brown',
name: {
first: 'Fischer',
last: 'French',
},
company: 'INCUBUS',
email: 'fischer.french@incubus.com',
},
{
_id: '5d406a17600ca53e8f63f263',
index: 14,
age: 30,
eyeColor: 'brown',
name: {
first: 'Donaldson',
last: 'Carr',
},
company: 'SUNCLIPSE',
email: 'donaldson.carr@sunclipse.tv',
},
{
_id: '5d406a17530655789a27174f',
index: 15,
age: 35,
eyeColor: 'green',
name: {
first: 'Sophia',
last: 'Payne',
},
company: 'PRISMATIC',
email: 'sophia.payne@prismatic.me',
},
{
_id: '5d406a175dbc687b4c7669d8',
index: 16,
age: 34,
eyeColor: 'green',
name: {
first: 'Simone',
last: 'Pollard',
},
company: 'DIGIGEN',
email: 'simone.pollard@digigen.org',
},
{
_id: '5d406a179f35ed326a6a5567',
index: 17,
age: 28,
eyeColor: 'green',
name: {
first: 'Yvette',
last: 'Daugherty',
},
company: 'CHILLIUM',
email: 'yvette.daugherty@chillium.us',
},
];
function getValue(object, path) {
return path
.replace(/\[/g, '.')
.replace(/\]/g, '')
.split('.')
.reduce((o, k) => (o || {})[k], object);
}
function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
var result = (getValue(a, property) < getValue(b, property)) ? -1 : (getValue(a, property) > getValue(b, property)) ? 1 : 0;
return result * sortOrder;
}
}
function dynamicSortMultiple() {
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
while(result === 0 && i < numberOfProperties) {
result = dynamicSort(props[i])(obj1, obj2);
i++;
}
return result;
}
}
function dynamicSortMultipleRic() {
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
while(result === 0 && i < numberOfProperties) result = dynamicSort(props[i++])(obj1, obj2);
return result;
}
}
var copyA = Object.assign([], datatable);
var copyB = Object.assign([], datatable);
var copyC = Object.assign([], datatable);
let a = copyA.sort(dynamicSort("name.first"));
let b = copyB.sort(dynamicSortMultiple("name.first","name.last"));
let c = copyC.sort(dynamicSortMultipleRic("name.first","name.last"));
console.log(a,b,c)