Попытка написать функцию, чтобы определить, имеет ли глубоко вложенный подмассив сложного объекта значения - PullRequest
2 голосов
/ 05 мая 2020

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

Раздел, который я пытаюсь проверить, - это контакты внутри каждого раздела contactGroups, где я сталкиваюсь с проблемами, потому что массив вложен на 4 уровня ниже, например object > array of objects > object > contacts array, и я не уверен, как сопоставить или выполнить итерацию в этот уровень.

Это мой первый проход в функции, которая на данный момент представляет собой скорее псевдокод:


  const hasContacts = (contacts: {}) => {
    if(contacts.contactGroups.length === 0 
       || contacts.contactGroups.map((contact) => contactGroups.contacts === undefined 
       || contacts.contactGroups.map((contact) => contactGroups.contacts.length === 0 ){
      return false
    }

    return contacts
  }

Структура данных выглядит так:

const mockContacts = {
  count: 1,
  contactGroups: [
    {
      contactGroup: "Family",
      count: 2,
      contacts: [
        {
          member: "Uncle",
          fullName: "BENJAMIN BILLIARDS",
          lastName: "BILLIARDS",
          firstName: "BENJAMIN",
          email: "shark@billiards.com",
        },
        {
          member: "Aunt",
          fullName: "DENISE NICE",
          lastName: "NICE",
          firstName: "DENISE",
          email: "floral@flowers.com",
        }
      ]
    },
    {
      contactGroup: "Friends",
      count: 2,
      contacts: [
        {
          member: "School Friend",
          fullName: "DERRICK SMITH",
          lastName: "SMITH",
          firstName: "DERRICK",
          email: "smith978@gmail.com",
        },
        {
          member: "Work Friend",
          fullName: "TARA SKY",
          lastName: "SKY",
          firstName: "TARA",
          email: "uptown94@gmail.com",
        }
      ]
    }

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Если вы хотите вернуть логическое значение, если есть какие-либо контакты, вы можете сделать следующее:

const hasContacts = ({ contactGroups = [] } = []) =>
  contactGroups.some(
    ({ contacts = [] } = {}) => contacts.length
  );

console.log('pass undefined', hasContacts());
console.log('pass empty object', hasContacts({}));
console.log(
  'pass empty contact group',
  hasContacts({ contactGroups: [] })
);
console.log(
  'pass empty contacts',
  hasContacts({ contactGroups: [{ contacts: [] }] })
);
console.log(
  'pass contacts',
  hasContacts({ contactGroups: [{ contacts: [1] }] })
);
console.log(
  'pass some contacts',
  hasContacts({
    contactGroups: [{ contacts: [] }, { contacts: [1] }],
  })
);

const mockContacts = {
  count: 1,
  contactGroups: [
    {
      contactGroup: 'Family',
      count: 2,
      contacts: [
        {
          member: 'Uncle',
          fullName: 'BENJAMIN BILLIARDS',
          lastName: 'BILLIARDS',
          firstName: 'BENJAMIN',
          email: 'shark@billiards.com',
        },
        {
          member: 'Aunt',
          fullName: 'DENISE NICE',
          lastName: 'NICE',
          firstName: 'DENISE',
          email: 'floral@flowers.com',
        },
      ],
    },
    {
      contactGroup: 'Friends',
      count: 2,
      contacts: [
        {
          member: 'School Friend',
          fullName: 'DERRICK SMITH',
          lastName: 'SMITH',
          firstName: 'DERRICK',
          email: 'smith978@gmail.com',
        },
        {
          member: 'Work Friend',
          fullName: 'TARA SKY',
          lastName: 'SKY',
          firstName: 'TARA',
          email: 'uptown94@gmail.com',
        },
      ],
    },
  ],
};
console.log(
  'mock contacts:',
  hasContacts(mockContacts)
);
1 голос
/ 05 мая 2020

Предполагая, что вложенные контакты contactGroup также не могут иметь больше вложений, это решение должно работать для вас. Мне было неясно, как вы хотите обрабатывать каждую вложенную группу, поэтому я вернул массив, который сообщит вам, есть ли у каждой вложенной группы контакты или нет.

const mockContacts = {
    count: 1,
    contactGroups: [
        {
            contactGroup: "Family",
            count: 2,
            contacts: [
                {
                    member: "Uncle",
                    fullName: "BENJAMIN BILLIARDS",
                    lastName: "BILLIARDS",
                    firstName: "BENJAMIN",
                    email: "shark@billiards.com",
                },
                {
                    member: "Aunt",
                    fullName: "DENISE NICE",
                    lastName: "NICE",
                    firstName: "DENISE",
                    email: "floral@flowers.com",
                }
            ]
        },
        {
            contactGroup: "Friends",
            count: 2,
            contacts: [
                {
                    member: "School Friend",
                    fullName: "DERRICK SMITH",
                    lastName: "SMITH",
                    firstName: "DERRICK",
                    email: "smith978@gmail.com",
                },
                {
                    member: "Work Friend",
                    fullName: "TARA SKY",
                    lastName: "SKY",
                    firstName: "TARA",
                    email: "uptown94@gmail.com",
                }
            ]
        }
    ]
}

const hasContacts = (contacts) => {
    // if contacts is not undefined, then check contactGroup
    if (contacts && Array.isArray(contacts.contactGroups)) {
        // we can have more than one contact group so need to check each
        return contacts.contactGroups.map(row=>Array.isArray(row.contacts) && row.contacts.length > 0)
    }
}

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