Reputation: 3226
How can I remove all objects which contain filter1
?
const obj = {
0: {
'filter1': {
'key1': {
'email1': 'email1'
}
}
},
1: {
'filter1': {
'key12': {
'email12': 'email12'
}
}
},
2: {
'filter2': {
'key2': {
'email2': 'email2'
}
}
}
}
Upvotes: 1
Views: 18210
Reputation: 4568
You can use reduce
to get a new object:
const newObject = Object.keys(obj).reduce((newObj, key) => {
if (!obj[key].filter1) {
newObj[key] = obj[key];
}
return newObj;
}, {});
const obj = {
0: {
'filter1': {
'key1': {
'email1': 'email1'
}
}
},
1: {
'filter1': {
'key12': {
'email12': 'email12'
}
}
},
2: {
'filter2': {
'key2': {
'email2': 'email2'
}
}
}
};
const newObject = Object.keys(obj).reduce((newObj, key) => {
if (!obj[key].filter1) {
newObj[key] = obj[key];
}
return newObj;
}, {});
console.log(newObject);
Or as @zerkms said, using entries
:
const entries = Object.entries(obj).reduce((newObj, [key, val]) => {
if (val.filter1) {
return newObj;
}
return {
...newObj,
[key]: val,
}
}, {});
const obj = {
0: {
'filter1': {
'key1': {
'email1': 'email1'
}
}
},
1: {
'filter1': {
'key12': {
'email12': 'email12'
}
}
},
2: {
'filter2': {
'key2': {
'email2': 'email2'
}
}
}
};
const newObject = Object.entries(obj).reduce((newObj, [key, val]) => {
if (val.filter1) {
return newObj;
}
return {
...newObj,
[key]: val,
}
}, {});
console.log(newObject);
Upvotes: 3
Reputation:
You could use Object.entries
to get an array of key-value pairs, then use Array#reduce
to filter the data and translate it back into an object format.
const obj = {
0: { 'filter1': { 'key1': { 'email1': 'email1' } } },
1: { 'filter1': { 'key12': { 'email12': 'email12' } } },
2: { 'filter2': { 'key2': { 'email2': 'email2' } } }
};
console.log(Object.entries(obj).reduce((m, [k, v]) => (v.filter1 || (m[k] = v), m), {}));
// { "2": { "filter2": { "key2": { "email2": "email2" } } } }
Further reading:
Upvotes: 0
Reputation: 974
To modify the object in place (rather than copying it, or creating arrays), I'd just use a simple loop and a delete:
let k = Object.keys(obj);
for (let i = 0; i < k.length ; i++ ) {
if (obj[k[i]].hasOwnProperty('filter1')) delete obj[k[i]];
}
Upvotes: 0
Reputation: 19228
Easy.
delete
API.hasOwnProperty
API.What you could do here is. First loop all of the keys in obj
and then check whether its value
(an object) has the filter1
property. If they do then delete
it away.
Example:
const obj = {
0: {
'filter1': {
'key1': {
'email1': 'email1'
}
}
},
1: {
'filter1': {
'key12': {
'email12': 'email12'
}
}
},
2: {
'filter2': {
'key2': {
'email2': 'email2'
}
}
}
};
for (var key in obj) {
var objectInKey = obj[key];
if (objectInKey.hasOwnProperty("filter1")) {
delete obj[key]
}
}
console.log(JSON.stringify(obj, null, 4));
console.log(obj[0]); // <-- Should be undefined.
console.log(obj[2]); // <-- Should not be undefined as obj wasn't deleted.
Upvotes: 3
Reputation: 1678
You can use filter
,
obj = obj.filter(o => o.filter1 == undefined);
See filter
reference here.
p.s. the obj
in this example is a var
not a const
, see snippet below
var obj = [
{
'filter1': {
'key1': {
'email1': 'email1'
}
}
},
{
'filter1': {
'key12': {
'email12': 'email12'
}
}
},
{
'filter2': {
'key2': {
'email2': 'email2'
}
}
}
];
console.log(obj); // initial obj
obj = obj.filter(o => o.filter1 == undefined);
console.log(obj); // element with `filter1` property is now deleted
Upvotes: -1