Bar Levin
Bar Levin

Reputation: 215

Remove empty values from array of objects only if the value is empty in all objects

I'm trying to remove the empty strings in my array.

This is my array:

let array = [
    { name: 'John', age: '18', address: '' }, 
    { name: 'George', age: '', address: '' }, 
    { name: 'Kevin', age: '25', address: '' }
]

I would like to remove the empty string values ONLY if it's empty in all objects.

desired outcome:

[
    { name:'John', age:'18' },
    { name:'George', age:'' },
    { name:'Kevin', age:'25' }
]

This is what I did but it removes EVERY empty string values:

 for (let i = 0; i < array.length; i++) {
    array[i] = Object.fromEntries(Object.entries(array[i]).filter(([_, v]) => v != ''));
 }

Upvotes: 4

Views: 866

Answers (3)

Godev
Godev

Reputation: 368

You can solve this issue with a filter method

  • get all the entries to be scanned in the array;
  • for each entry, filter the array with it; if the output array is empty then you can delete this value in the original array

let array = [{name:'John',age:'18',address:''},{name:'George',age:'',address:''},{name:'Kevin',age:'25',address:''}]

const entries = Object.keys(array[0])

entries.forEach(e => {
  if (array.filter(i => i[e]).length === 0) {
    array = array.map(i => {
      delete i[e];
      return i
    })
  }
})

console.log(array)

Upvotes: 3

Alan Omar
Alan Omar

Reputation: 4217

If you don't want to mutate the original array:

let array = [{name:'John',age:'18',address:''},{name:'George',age:'',address:''},{name:'Kevin',age:'25',address:''}]


let result;

Object.keys(array[0])
.forEach(key => {
    if(array.every(e => e[key] === ''))
        result = array.map(({[key]:_,...rest}) => ({...rest}))
})

console.log(result)

Upvotes: 1

Hao Wu
Hao Wu

Reputation: 20669

If you don't mind mutating the original array object. Here's a solution utilizing some array functions.

let array = [
  { name: 'John', age: '18', address: '' },
  { name: 'George', age: '', address: '' },
  { name: 'Kevin', age: '25', address: '' }
]

Object.keys(array[0])
  .filter(k => array.every(obj => !obj[k]))
  .forEach(k => array.forEach(obj => delete obj[k]));

console.log(array);

Upvotes: 7

Related Questions