JSON и узел в Swift, как можно реализовать фильтры для категорий в запросе GET - PullRequest
0 голосов
/ 18 сентября 2018

Просто я хочу отфильтровать полный массив json по трем категориям.

Позвольте мне показать вам, о чем я говорю

var menu = [
    {
        id: "coffe",
        name: "Espresso",
        description: "",
        image: ''
    },
    {
        id: "coffe",
        name: "Latte",
        description: "",
        image: ''
    },
    {
        id: "coffe-nosugar",
        name: "Hot Chocolate",
        description: "",
        image: ''
    },
{
        id: "tea",
        name: "Red Tea",
        description: " ",
        amount: "0.0",
        image: ''
    },
        {
        id: "tea",
        name: "Green Tea",
        description: " ",
        amount: "0.0",
        image: ''
    },
                {
        id: "fresh-juice",
        name: "Orange",
        description: "",
        amount: "0.0",
        image: ''
    }
]

Теперь, кто-нибудь, пожалуйста, скажите мне, как я могу разделить эти данные на три категории

  • Кофе
  • чай
  • Сок

Пока я использую это в моем узле JS

app.get('/menu', (req, res) => res.json(menu))

Чтобы показать все предметы инвентаря без каких-либо фильтров, просто перейдите на http://APIurl/menu

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018
struct Menu: Codable {

    var id: String
    var name: String
    var description: String
    var image: String
    var amount: String
    var category: String
}

var menu = "[\r\n  {\r\n    \"name\": \"Espresso\",\r\n    \"id\": \"coffe\",\r\n    \"description\": \"\",\r\n    \"image\": \"\",\r\n    \"amount\": \"0.0\",\r\n    \"category\": \"Coffee\"\r\n  },\r\n  {\r\n    \"name\": \"Latte\",\r\n    \"id\": \"coffe\",\r\n    \"description\": \"\",\r\n    \"image\": \"\",\r\n    \"amount\": \"0.0\",\r\n    \"category\": \"Coffee\"\r\n  },\r\n  {\r\n    \"id\": \"coffe-nosugar\",\r\n    \"name\": \"Hot Chocolate\",\r\n    \"description\": \"\",\r\n    \"image\": \"\",\r\n    \"amount\": \"0.0\",\r\n    \"category\": \"Tea\"\r\n  },\r\n  {\r\n    \"id\": \"tea\",\r\n    \"name\": \"Red Tea\",\r\n    \"description\": \" \",\r\n    \"amount\": \"0.0\",\r\n    \"image\": \"\",\r\n    \"category\": \"Tea\"\r\n  },\r\n  {\r\n    \"id\": \"tea\",\r\n    \"name\": \"Green Tea\",\r\n    \"description\": \" \",\r\n    \"amount\": \"0.0\",\r\n    \"image\": \"\",\r\n    \"category\": \"Tea\"\r\n  },\r\n  {\r\n    \"id\": \"fresh-juice\",\r\n    \"name\": \"Orange\",\r\n    \"description\": \"\",\r\n    \"amount\": \"0.0\",\r\n    \"image\": \"\",\r\n    \"category\": \"Juice\"\r\n  }\r\n]"

if let data = menu.data(using: .utf8) {
    let decoder = JSONDecoder()
        do {
            let menus = try decoder.decode([Menu].self, from: data)
            let categorizedMenu = Dictionary(grouping: menus) { $0.category }
        } catch {
            print(error.localizedDescription)
        }
    }

Эта строка делает свое дело, что здесь происходит, мы группируем массив объектов по свойству, которое категория :

Dictionary(grouping: menus) { $0.category }

Кстати, в моем ответе,Я добавил новое свойство, которое категория в объекте, не рекомендуется группировать объекты по id , поскольку id всегда уникально .

0 голосов
/ 19 сентября 2018
var menu: [MenuItems] = []

override func viewDidLoad() {
        super.viewDidLoad()

        fetchInventory { menu in
// Answer: This is will eliminate items with id == "1".
            menu = (menu?.filter { $0.id != "1"})! 
//Show All Items
            self.menu = menu! 

            self.tableView.reloadData()
        }
    }

Это спасло меня от двух дней размышлений. Благодаря Вонджунг Ким ! Смотрите полный пост здесь: Как я могу реализовать фильтр массива с Swift?

...