-3

Below is my Object data

var testObj ={
    "AAA": {
    "number":{
        "123":{},
        "5435":{},
        "5466":{}
    }
  },
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "CCC":{
    "number":{
        "214543":{},
        "32432":{},
        "12435":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
}

How can I filter this object and get a new Object which has number "111" like below?

var testObj ={
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
}
Dreams
  • 8,288
  • 10
  • 45
  • 71
  • 1
    What have you tried? A [`for..in` loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) would help a lot. – Mike Cluck Nov 15 '16 at 16:36
  • Is expected result a new object, or original object having properties that do not include an object having property name `"111"` removed? – guest271314 Nov 15 '16 at 17:43

4 Answers4

0

You can use Object.keys() and reduce() and check for key with hasOwnProperty()

var testObj = {"AAA":{"number":{"123":{},"5435":{},"5466":{}}},"BBB":{"number":{"111":{},"4656":{},"54656":{}}},"CCC":{"number":{"12435":{},"32432":{},"214543":{}}},"DDD":{"number":{"111":{},"343":{},"123213":{}}}}

var result = Object.keys(testObj).reduce(function(r, key) {
  if (testObj[key].number.hasOwnProperty('111')) {
    r[key] = testObj[key]
  }
  return r;
}, {})

console.log(result)
Nenad Vracar
  • 118,580
  • 15
  • 151
  • 176
0

You can use Object.keys and Array.prototype.reduce to get all the object keys, filter out ones with a custom predicate (in this case, whether foo.number.111 is set), and build an object with the results:

const testObj = {
  "AAA": {
    "number": {
      "123": {},
      "5435": {},
      "5466": {}
    }
  },
  "BBB": {
    "number": {
      "54656": {},
      "111": {},
      "4656": {}
    }
  },
  "CCC": {
    "number": {
      "214543": {},
      "32432": {},
      "12435": {}
    }
  },
  "DDD": {
    "number": {
      "343": {},
      "123213": {},
      "111": {}
    }
  }
};

const result = Object.keys(testObj).filter(key => {
  return testObj[key].number['111'];
}).reduce((p, key) => {
  p[key] = testObj[key];
  return p;
}, {});

console.log(result);
ssube
  • 47,010
  • 7
  • 103
  • 140
0

You can use Object.keys(), for..of loop, JSON.stringify(), RegExp.prorotype.test() with RegExp <property name including quotes followed by ":">, delete. To preserve original object utilize Object.assign() to create a new object having properties of original object, iterate and delete objects from new object.

var testObj ={
    "AAA": {
    "number":{
        "123":{},
        "5435":{},
        "5466":{}
    }
  },
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "CCC":{
    "number":{
        "214543":{},
        "32432":{},
        "12435":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
}

let prop = `"111"`, re = new RegExp(prop + ":");

for (let o of Object.keys(testObj)) 
    if (!re.test(JSON.stringify(testObj[o]))) 
      delete testObj[o];

console.log(testObj);
guest271314
  • 1
  • 15
  • 104
  • 177
  • That's cool but it would return the filtered objects in an array whereas OP needs them in an object. – Redu Nov 15 '16 at 16:51
  • Well i am reluctant when it comes to morphing what doesn't belong to me but for the variety of the solutions as per this answer i would +. – Redu Nov 15 '16 at 17:00
0

You may do as follows;

var testObj ={
    "AAA": {
    "number":{
        "123":{},
        "5435":{},
        "5466":{}
    }
  },
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "CCC":{
    "number":{
        "214543":{},
        "32432":{},
        "12435":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
},
filtered = Object.keys(testObj).filter(k => Object.keys(testObj[k].number).includes("111"))
                 .reduce((p,k) => (p[k] = Object.assign({},testObj[k]),p),{});
console.log(filtered);
Redu
  • 25,060
  • 6
  • 56
  • 76
  • OP is removing objects then redefining original object with same variable name. – guest271314 Nov 15 '16 at 17:00
  • @guest271314 Good point... then an `Object.asign()` should suffice. – Redu Nov 15 '16 at 17:06
  • Note, `Object.assign()` with `{}` passed as first parameter creates a new object, does not affect object passed at second parameter. – guest271314 Nov 15 '16 at 17:15
  • Though, at second glance at Question, not entirely clear if OP is expecting a new object, or original object with properties removed, as expected object result at Question has same variable name `testObj`. – guest271314 Nov 15 '16 at 17:45