Фильтровать объект на основе свойства внутри вложенного объекта - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть javascript объект, структурированный так:

var obj = {
    HEALTH: {
       business: "HEALTH",
       percentage: 0,
       outerCriteria:{
          DEFAULT:[
            {
                thePercentage : 10,
                innerCriteria : {
                     min: '10',
                     max: '20',
                     city: 'Denver',
               }
            }
          ],
          RANDOM:[
            {
                thePercentage : 20,
                innerCriteria : {
                     min: '50',
                     max: '20',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 30,
                innerCriteria : {
                     min: '50',
                     max: '60',
                     city: 'Barrington',
               }
            },
            {
                thePercentage : 36,
                innerCriteria : {
                     min: '20',
                     max: '62',
                     city: 'Barrington',
               }
            },
          ],
          NEW:[
            {
                thePercentage : 5,
                innerCriteria : {
                     min: '5',
                     max: '20',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 6,
                innerCriteria : {
                     min: '5',
                     max: '60',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 36,
                innerCriteria : {
                     min: '20',
                     max: '62',
                     city: 'Barrington',
               }
            },
          ],
       }
    } 
}

Я хочу, чтобы это было отфильтровано на основе city . Например, если я фильтрую для Дарлингтона , желаемый результат будет:

var obj = {
    HEALTH: {
       business: "HEALTH",
       percentage: 0,
       outerCriteria:{
          RANDOM:[
            {
                thePercentage : 20,
                innerCriteria : {
                     min: '50',
                     max: '20',
                     city: 'Darlington',
               }
            },
          ],
          NEW:[
            {
                thePercentage : 5,
                innerCriteria : {
                     min: '5',
                     max: '20',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 6,
                innerCriteria : {
                     min: '5',
                     max: '60',
                     city: 'Darlington',
               }
            },
          ],
       }
    } 
}

Я пытался использовать фильтр и карту, но безрезультатно. Я пытаюсь выполнить фильтрацию с некоторыми, но не смог пройти через это.

Переполнение стека не позволяет мне опубликовать этот вопрос, говоря, чтобы дать больше деталей. У меня нет больше деталей, чувак. Это все, что у меня есть. Если кто-то хочет спросить, вы всегда можете прокомментировать.

Пожалуйста, помогите. Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020
var unfilteredOuterCriteria = obj.HEALTH.outerCriteria;
var filteredOuterCriteria = {};

for(attr in obj.HEALTH.outerCriteria){
    filteredOuterCriteria[attr] = 
obj.HEALTH.outerCriteria[attr].filter(criteria => criteria.innerCriteria.city === 'Darlington');
}

obj.HEALTH.outerCriteria = filteredOuterCriteria;
0 голосов
/ 14 апреля 2020

Вы можете использовать метод array.filter() для фильтрации по городу и метод delete() для удаления свойств объекта (если массив, связанный с данным ключом, пуст).

Пример функции:

function filterByCity(city) {
    for(let o in obj.HEALTH.outerCriteria) {
        obj.HEALTH.outerCriteria[o] = obj.HEALTH.outerCriteria[o].filter((item) => item.innerCriteria.city == city);
        if(obj.HEALTH.outerCriteria[o].length == 0) {  // if the array is empty delete it
            delete(obj.HEALTH.outerCriteria[o]);
        }
    }
}

Выполнение и проверка:

var obj = {
    HEALTH: {
       business: "HEALTH",
       percentage: 0,
       outerCriteria:{
          DEFAULT:[
            {
                thePercentage : 10,
                innerCriteria : {
                     min: '10',
                     max: '20',
                     city: 'Denver',
               }
            }
          ],
          RANDOM:[
            {
                thePercentage : 20,
                innerCriteria : {
                     min: '50',
                     max: '20',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 30,
                innerCriteria : {
                     min: '50',
                     max: '60',
                     city: 'Barrington',
               }
            },
            {
                thePercentage : 36,
                innerCriteria : {
                     min: '20',
                     max: '62',
                     city: 'Barrington',
               }
            },
          ],
          NEW:[
            {
                thePercentage : 5,
                innerCriteria : {
                     min: '5',
                     max: '20',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 6,
                innerCriteria : {
                     min: '5',
                     max: '60',
                     city: 'Darlington',
               }
            },
            {
                thePercentage : 36,
                innerCriteria : {
                     min: '20',
                     max: '62',
                     city: 'Barrington',
               }
            },
          ],
       }
    } 
}

function filterByCity(city) {
  for(let o in obj.HEALTH.outerCriteria) {
    obj.HEALTH.outerCriteria[o] = obj.HEALTH.outerCriteria[o].filter((item) => item.innerCriteria.city == city);
    if(obj.HEALTH.outerCriteria[o].length == 0) {  // if the array is empty delete it
      delete(obj.HEALTH.outerCriteria[o]);
    }
  }
}

filterByCity('Darlington');
console.log(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...