Как я могу отфильтровать значения в массиве JSON?

Когда я получаю данные из API, он возвращает меня, как показано ниже JSON (ответ)

{
   "brand": "",
   "item": [
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": ""
      },
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": "https..."
      }
   ]
}

Мои ожидания: Если item.url == "", то элемент будет немедленно удален.

После удаления:

{
   "brand": "",
   "item": [
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": "https..."
      },
      {
         "name": "ABC",
         "url": "https..."
      }
   ]
}
struct DataDetail {
    var brand:Brand
    var items: [Item]
    
    struct Brand {
        let title: String?
        let image: URL?
    }
    
    public struct Item {
        let name: String
        let url: URL?
    }
}

var dataDetail1: DataDetail

fetchAPI { [weak self] response in
    self.dataDetail1 = response
}

Как я могу отфильтровать (ответ), чтобы он отображался так, как ожидалось? Если item.url == "", то элемент будет немедленно удален.

Теперь я заметил, что ни один из ваших типов не соответствует Codable и что образец json с "" для бренда выглядит странно. Как вы в настоящее время конвертируете json в свои пользовательские типы?

Joakim Danielson 11.04.2023 15:49

Почему бы не обновить оба образца? И, пожалуйста, ответьте на мой вопрос.

Joakim Danielson 11.04.2023 15:52

Вы можете просто понять, что: я хочу удалить 1 элемент в элементе (если item.url пуст)

Ky Gia 11.04.2023 15:52
self.dataDetail1 = DataDetail(brand: response.brand, items: response.items.filter { DoTheFilterHere }), теперь, поскольку url является необязательным, это ноль?
Larme 11.04.2023 16:08

@Larme это необязательно, если оно равно нулю, оно будет удалено из элемента в элементе.

Ky Gia 11.04.2023 16:15

Тогда DoTheFilterHere это $0.url != nil? Или я не понимаю тест, который вы хотите сделать. потому что пустая строка не является допустимой URL.

Larme 11.04.2023 16:21
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При декодировании в свой тип вы можете добавить пользовательскую инициализацию для удаления пустых строк и нулей.

struct Brand: Codable {
    let brand: String
    var item: [Item]

    enum CodingKeys: String, CodingKey {
        case brand
        case item
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        brand = try container.decode(String.self, forKey: .brand)
        var items = try container.decode([Item].self, forKey: .item)
        items = items.filter { $0.url != nil } //remove nil 
        items.removeAll { $0.url!.isEmpty } //remove empty
        item = items
    }
}

Другие вопросы по теме