Reputation: 1093
I'm having an array look like this
[
{
object1:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1}
},
{
object2:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1}
},
{
object3:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1}
},
]
Now i want to get rid of every nested item that have more than one item and keep only the first, like :
[
{
object1:{ childObj1:[grandChild1]}
},
{
object2:{ childObj2:[grandChild1]}
},
{
object3:{ childObj3:[grandChild1]}
},
]
Which is the most effective way to do this?
Upvotes: 0
Views: 319
Reputation: 166
Try this:
const arr = [{
object1: {
childObj1: ['grandChild1', 'grandChild2'],
childObj2: {},
childObj3: {}
}
},
{
object2: {
childObj1: ['grandChild1', 'grandChild2'],
childObj2: {},
childObj3: {}
}
},
{
object3: {
childObj1: ['grandChild1', 'grandChild2'],
childObj2: {},
childObj3: {}
}
},
]
function f(obj, startLevel, currentLevel = 0) {
let value
if (Array.isArray(obj)) {
value = []
} else if (typeof obj === 'object') {
value = {}
} else {
value = obj
}
if (typeof obj === 'object') {
for (let i in obj) {
if (currentLevel >= startLevel) {
if (Array.isArray(obj[i])) {
value[i] = obj[i].length ? [f(obj[i][0], startLevel, currentLevel + 1)] : [];
} else {
value[i] = f(obj[i], startLevel, currentLevel + 1)
}
break;
} else {
value[i] = f(obj[i], startLevel, currentLevel + 1)
}
}
}
return value;
}
console.log(f(arr, 1));
Upvotes: 1
Reputation: 22587
const arr = [{
object1: {
childObj1: ['grandChild1', 'grandChild2'],
childObj3: 't',
childObj2: 'r'
}
},
{
object2: {
childObj1: ['grandChild1', 'grandChild2'],
childObj3: 't',
childObj2: 'r'
}
},
{
object3: {
childObj1: ['grandChild1', 'grandChild2'],
childObj3: 't',
childObj2: 'r'
}
},
];
console.log(arr.map(el => {
const child = el[Object.keys(el)[0]];
const firstProperty = {
[Object.keys(child)[0]]: child[Object.keys(child)[0]]
};
return {
[Object.keys(el)[0]]: firstProperty
}
}));
Hope this is what you wanted.
Upvotes: 1