Как мне отфильтровать массив объектов и сохранить имя ключа объекта? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть некоторые данные JSON, в которых я пытаюсь отфильтровать объекты JSON, которые не имеют определенного свойства.

Я могу использовать функцию фильтра из Underscore.JS дляуспешно отфильтровать объекты, которые не имеют правильного свойства.

Однако, когда функция фильтра выполняется, она удаляет ключевое имя объекта.

Вот JSON, которыйиспользуется в переменной data в функции фильтра ниже:

{
    "Presentations": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 5
    },
    "Articles": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 1
    },
    "Blogs": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 61
    },
    "NewsBriefs": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 2
    },
    "SpecialInsights": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 50
    },
    "UserSelected": {
        "Frequency": null,
        "Value": false,
        "ContentTypeId": 0
    }
}

Вот функция фильтра JavaScript, которая возвращает массив объектов, которые должны включать свойствоиз 'Мгновенное'

newArr = _.filter(data, function(obj){
              return obj.hasOwnProperty('Instant')
          });

Если я утешаю .log newArr, вот что я получаю:

[
   {
      "Instant":false,
      "Daily":false,
      "WeeklySummary":false,
      "ContentTypeId":5
   },
   {
      "Instant":true,
      "Daily":false,
      "WeeklySummary":true,
      "ContentTypeId":1
   },
   {
      "Instant":true,
      "Daily":false,
      "WeeklySummary":true,
      "ContentTypeId":61
   },
   {
      "Instant":false,
      "Daily":false,
      "WeeklySummary":false,
      "ContentTypeId":2
   },
   {
      "Instant":false,
      "Daily":false,
      "WeeklySummary":false,
      "ContentTypeId":50
   }
]

Как видите, это правильноотфильтровывать объекты, у которых нет свойства Instant, которое в данном случае является объектом UserSelected.

Однако в этом процессе я теряю имена ключей объекта, такие как Presentations и Articles.

Как сохранить эти имена ключей, когдафильтрация данных JSON?

1 Ответ

4 голосов
/ 23 сентября 2019

вы можете сделать это без какой-либо библиотеки:

Object.entries(data).filter(([key, value]) => {
  return value.hasOwnProperty('Instant')
}).reduce((acc, [key, value]) => {
  return { ...acc, [key]: value }
}, {})

что вы сделали неправильно, так это то, что вы сохраняли значение только при переборе по словарю, но никогда не переносили ключи.Вы также можете использовать новый fromEntries Я думаю, но он работает так же, как

...