Как отфильтровать объект имеет более одного слоя - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть исторический объект со значениями для каждой даты в диапазоне:

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

Мне нужно только одно из свойств, поэтому я пытаюсь отфильтровать объект по этому:

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

Я попытался дать следующий метод, чтобы решить эту проблему:

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)

он выполняет свою работу, но дает мне массив

edit: я построил свое решение, используя JavaScript: filter () для объектов .Проблема здесь заключается в изменении даты ключей объекта ответа.Также в некоторых случаях мне может понадобиться отфильтровать 3 из 5 и т. Д.

1 Ответ

3 голосов
/ 19 сентября 2019

.reduce 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...