Search code examples
javascriptjavascript-objects

How to filter an object has more than one layer


I have an historical object with values for each date in a range:

response = {
          2019-09-13: {logged-in: 3, clicked-something: 15}
          2019-09-14: {logged-in: 0, clicked-something: 0}
          2019-09-15: {logged-in: 0, clicked-something: 0}
          2019-09-16: {logged-in: 0, clicked-something: 0}
          2019-09-17: {logged-in: 0, clicked-something: 0}
          2019-09-18: {logged-in: 2, clicked-something: 24}
          2019-09-19: {logged-in: 7, clicked-something: 36}
          }

I only need one of the properties so trying to filter the object into this:

          2019-09-13: {clicked-something: 15}
          2019-09-14: {clicked-something: 0}
          2019-09-15: {clicked-something: 0}
          2019-09-16: {clicked-something: 0}
          2019-09-17: {clicked-something: 0}
          2019-09-18: {clicked-something: 24}
          2019-09-19: {clicked-something: 36}
          }

I have tried to give following method to solve this:

const data = {
  "2019-09-13": { "logged-in": 3, "clicked-something": 15 },
  "2019-09-14": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-15": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-16": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-17": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-18": { "logged-in": 2, "clicked-something": 24 },
  "2019-09-19": { "logged-in": 7, "clicked-something": 36 }
};

const allowed = ["clicked-something"]

const result = Object.values(data).map(item => {
  return Object.keys(item)
    .filter(key => allowed.includes(key))
    .reduce((obj, key) => {
      obj[key] = item[key]
      return obj
    }, {})
})

console.log(result)

it does the job but gives me an array

edit: I have constructed my solution by using JavaScript: filter() for Objects. Problem here is changing date keys of the response object. Also in some occasions I may need to filter 3 out of 5, etc.


Solution

  • .reduce the Object.entries

    const response = {
      "2019-09-13": { "logged-in": 3, "clicked-something": 15 },
      "2019-09-14": { "logged-in": 0, "clicked-something": 0 },
      "2019-09-15": { "logged-in": 0, "clicked-something": 0 },
      "2019-09-16": { "logged-in": 0, "clicked-something": 0 },
      "2019-09-17": { "logged-in": 0, "clicked-something": 0 },
      "2019-09-18": { "logged-in": 2, "clicked-something": 24 },
      "2019-09-19": { "logged-in": 7, "clicked-something": 36 }
    };
    
    const allowed = ["clicked-something"];
    
    const result = Object.entries(response).reduce((acc, [key, value]) => {
      acc[key] = allowed.reduce((ac, k) => {
        ac[k] = value[k];
        return ac;
      }, {});
      return acc;
    }, {});
    
    console.log(result);