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:
let hobbies = [ 'running', 'coding', '-', 'truc', '-', 'bidule' ]
for (let i=hobbies.length;i--;)
if (hobbies[i]==='-')
hobbies.splice(i,1)
console.log( JSON.stringify( hobbies ) )