Ciprian
Ciprian

Reputation: 3226

Javascript / Typescript - Remove from object

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

Answers (5)

dork
dork

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

user4639281
user4639281

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

david25272
david25272

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

Samuel Toh
Samuel Toh

Reputation: 19228

Easy.

  1. To remove an object you can use the delete API.
  2. To check whether an object has a specific key you can use the 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

samAlvin
samAlvin

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

Related Questions