Trying to understand and practice manipulation of passed in data I have created an array of objects:
const pizzaObj = [
{
id: 'mon',
name: 'Monday',
subMenu: [],
},
{
id: 'tues',
name: 'Tuesday',
subMenu: [
{
id: 'small',
name: 'Small',
},
{
id: 'medium',
name: 'Medium',
},
{
id: 'large',
name: 'Large',
},
{
id: 'xlarge',
name: 'X Large',
},
],
},
{
id: 'wed',
name: 'Wednesday',
subMenu: [],
},
]
that I'm trying to filter out medium
and large
from the subMenu
so it will look like:
const pizzaObj = [
{
id: 'mon',
name: 'Monday',
subMenu: [],
},
{
id: 'tues',
name: 'Tuesday',
subMenu: [
{
id: 'small',
name: 'Small',
},
{
id: 'xlarge',
name: 'X Large',
},
],
},
{
id: 'wed',
name: 'Wednesday',
subMenu: [],
},
]
I can remove if just targeting the subMenu
:
const listToDelete = ['medium', 'large']
const pizzaObj = [
{
id: 'small',
name: 'Small',
},
{
id: 'medium',
name: 'Medium',
},
{
id: 'large',
name: 'Large',
},
{
id: 'xlarge',
name: 'X Large',
},
]
const result = pizzaObj.filter( el => (-1 == listToDelete.indexOf(el.id)) )
console.log(result)
But when I try filtering with the object using some
the data isn't removed:
const listToDelete = ['medium', 'large']
const pizzaObj = [
{
id: 'mon',
name: 'Monday',
subMenu: [],
},
{
id: 'tues',
name: 'Tuesday',
subMenu: [
{
id: 'small',
name: 'Small',
},
{
id: 'medium',
name: 'Medium',
},
{
id: 'large',
name: 'Large',
},
{
id: 'xlarge',
name: 'X Large',
},
],
},
{
id: 'wed',
name: 'Wednesday',
subMenu: [],
},
]
const result = pizzaObj.filter(m => {
return Object.keys(m).some(key => {
return key === 'subMenu'
? m[key].filter(item => -1 === listToDelete.indexOf(item.id))
: m[key]
})
})
console.log(result)
I've also tried with map
:
const pizzaObj = [
{
id: 'mon',
name: 'Monday',
subMenu: [],
},
{
id: 'tues',
name: 'Tuesday',
subMenu: [
{
id: 'small',
name: 'Small',
},
{
id: 'medium',
name: 'Medium',
},
{
id: 'large',
name: 'Large',
},
{
id: 'xlarge',
name: 'X Large',
},
],
},
{
id: 'wed',
name: 'Wednesday',
subMenu: [],
},
]
const testStrip = data => {
const listToDelete = ['medium', 'large']
return data.filter(m => {
return Object.keys(m).map(key => {
return key === 'subMenu'
? m[key].filter(item => -1 === listToDelete.indexOf(item.id))
: m[key]
})
})
}
console.log(testStrip(pizzaObj))
Research:
- javascript filter array multiple conditions
- Remove Object from Array using JavaScript
- Remove array element based on object property
- Find and remove objects in an array based on a key value in JavaScript
- JavaScript Array - Filter out values that do not match specific strings
- Replace object value with other object's value of the same key with JavaScript
What am I misunderstanding and how should I be filtering out medium
and large
?