soileh
soileh

Reputation: 5

Filter boolean from an json object in javascript

I would like to filter all boolean values from an json object in javascript. I managed to get it working on a simple json object but in my case I have got a nested one. Here is an example of the object. I dont know how to manage this structure.

{  
    "User1":
     {  
      "age":15,
      "country":"sw",
      "glasses":true,
      "car":true,
      "zip":1223,
      "name":"Frank"
    },
    "User2":
     {  
      "age":23,
      "country":"fr",
      "glasses":false,
      "car":true,
      "zip":5577,
      "name":"Mike"
    }
}

And as a result I would like to receive something like this:

{  
   "User1":{  
      "glasses":true,
      "car":true
   },
   "User2":{  
      "glasses":false,
      "car":true
   }
}

Upvotes: 0

Views: 2467

Answers (5)

Vivek
Vivek

Reputation: 1513

This is how you can filter all the boolean values from object -

let input = {
  "User1": {
    "age": 15,
    "country": "sw",
    "glasses": true,
    "car": true,
    "zip": 1223,
    "name": "Frank"
  },
  "User2": {
    "age": 23,
    "country": "fr",
    "glasses": false,
    "car": true,
    "zip": 5577,
    "name": "Mike"
  }
};

let output = {};
Object.entries(input).map(([key, value], index) => {
  output[key] = {};
  Object.entries(value).
      filter(([k, v], i) => typeof v === "boolean").
      map(([k, v], i) => {
        output[key][k] = v;
      })
});

console.log(output);

Upvotes: 0

Jonas Wilms
Jonas Wilms

Reputation: 138267

 const result = {};

 for(const [key, value] of Object.entries(input)) {
   const {glasses, car} = value;
   result[key] = {glasses, car};
}

Just iterate over the objects entries and make some destructuring on the inner objects. Or if you really want every boolean:

 const result = {};

 for(const [key, value] of Object.entries(input)) {
   const out = result[key] = {};
   for(const [innerKey, innerValue] of Object.entries(value)) {
     if(typeof innerValue === "boolean")
       out[innerKey] = innerValue;
   }
 }

Upvotes: 1

Slai
Slai

Reputation: 22876

For actual JSON string, the JSON.parse reviver parameter can be used to exclude or modify values:

var j = '{"User1":{"age":15,"country":"sw","glasses":true,"car":true,"zip":1223,"name":"Frank"},"User2":{"age":23,"country":"fr","glasses":false,"car":true,"zip":5577,"name":"Mike"}}';

var o = JSON.parse(j, (k, v) => typeof v == 'number' || typeof v == 'string' ? void 0 : v);

console.log(o);

Upvotes: 1

Martín Zaragoza
Martín Zaragoza

Reputation: 1817

Try this

function parse(obj , targetObject) {
var k;
if (obj instanceof Object) {
    for (k in obj){
        if(typeof(obj[k]) === "boolean"){
            targetObject[k] = obj[k];
        }
        if(obj[k] instanceof Object) {
            targetObject[k] = {};
            parse(obj[k],targetObject[k]);
        }
    }
} 

};

Call like this:

var target = {};
parse(myObj , target);

Hope this helps

Upvotes: 0

mccambridge
mccambridge

Reputation: 1022

If you don't know which keys will be booleans, you can do it like this.

Let's say you assign that object to a variable.

var myObject = {  
    "User1": {  
        "age":15,
        "country":"sw",
        "glasses":true,
        "car":true,
        "zip":1223,
        "name":"Frank"
    },
    "User2": {  
        "age":23,
        "country":"fr",
        "glasses":false,
        "car":true,
        "zip":5577,
        "name":"Mike"
    }
}

Then you can loop through the object and assign the filtered results to myBooleans.

var myBooleans = {};

Object.keys(myObject).forEach(function(key) {
    var myNewUserObject = {};
    Object.keys(myObject[key]).forEach(function(userKey) {
        if (typeof myObject[key][userKey] === 'boolean') {
            myNewUserObject[userKey] = myObject[key][userKey];
        }
    });
    myBooleans[key] = myNewUserObject;
});

There is probably a pretty way to do with with n levels of object using recursion. But this will work for the shape of the data you provided.

Upvotes: 0

Related Questions