Home > OS >  How Can I remove "1 empty item" from the json object in javascript
How Can I remove "1 empty item" from the json object in javascript

Time:08-13

The sample json object. I tried to remove all "-", "N/A", and "" from this JSON object.

{
  name: { first: 'Robert', middle: '', last: 'Smith' },
  age: 25,
  DOB: '-',
  hobbies: [ 'running', 'coding', '-' ],
  education: { highschool: 'N/A', college: 'Yale' }
}

I did something like it. but couldn't manage to remove <1 empty item> from the array

{
  name: { first: 'Robert', last: 'Smith' },
  age: 25,
  hobbies: [ 'running', 'coding', <1 empty item> ],
  education: { college: 'Yale' }
}

How can I remove the <1 empty item> from the json object.

This is my code

axios.get("https://coderbyte.com/api/challenges/json/json-cleaning")
  .then((res) => {
    let parseData = res.data;

    const removeValue = (obj) => {
      Object.keys(obj).forEach(k => 
        
        // console.log(obj[k])
        (obj[k] && obj[k] === "-") && 
        delete obj[k] ||

        (obj[k] && typeof obj[k] === 'object')
        && removeValue(obj[k]) || 
        
        (!obj[k] && obj[k] !== undefined) && 
        delete obj[k] || 
        
        (obj[k] && obj[k] === "N/A") && 
        delete obj[k]


      );
      return obj
    }

    newData = removeValue(parseData)

    console.log(newData)
  })

CodePudding user response:

Using delete is fine on objects, but for arrays, it will remove the property while keeping the array's .length the same. So, for example, delete-ing the 3rd item of an array of length 3 will result in an array with two array-indexed properties (0 and 1), but keep its length of 3.

Check if the object is an array. If it's an array, .filter instead.

const payload = {
  name: { first: 'Robert', middle: '', last: 'Smith' },
  age: 25,
  DOB: '-',
  hobbies: [ 'running', 'coding', '-' ],
  education: { highschool: 'N/A', college: 'Yale' }
};
const isGoodValue = val => val && val !== '-' && val !== 'N/A';

const removeBadValues = (obj) => {
  if (Array.isArray(obj)) {
    return obj
      .filter(isGoodValue)
      .map(removeBadValues);
  }
  if (typeof obj === 'object') {
    for (const [key, value] of Object.entries(obj)) {
      if (!isGoodValue(value)) {
        delete obj[key];
      } else {
        obj[key] = removeBadValues(value);
      }
    }
  }
  return obj;
}
const newData = removeBadValues(payload)
console.log(newData)

CodePudding user response:

You can use this

obj.hobbies.splice(obj.hobbies.indexOf('-'), 1);

Where obj is the object you pass in.

CodePudding user response:

use Array.prototype.splice()

let hobbies = [ 'running', 'coding', '-', 'truc', '-', 'bidule' ]


for (let i=hobbies.length;i--;)
if (hobbies[i]==='-')
  hobbies.splice(i,1)

console.log( JSON.stringify( hobbies ) )

  • Related