2 votes

Comment filtrer un objet ayant plus d'une couche ?

J'ai un objet historique avec des valeurs pour chaque date dans un intervalle :

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}
          }

Je n'ai besoin que d'une seule des propriétés et j'essaie donc de filtrer l'objet dans ce domaine :

          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}
          }

J'ai essayé de donner la méthode suivante pour résoudre ce problème :

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)

il fait le travail mais me donne un tableau

edit : j'ai construit ma solution en utilisant JavaScript : filter() pour les objets . Le problème est la modification des clés de date de l'objet réponse. De plus, dans certaines occasions, je peux avoir besoin de filtrer 3 sur 5, etc.

3voto

Taki Points 7381

.reduce les 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X