Фильтровать массив объектов на основе массива строк свойства объекта

У меня есть массив таких объектов, как:

let food = [apple, orange, peach, pear].

Каждый объект выглядит примерно так:

let apple : Fruit = [
  name: "Apple",
  colors: ["red", "yellow", "green", "orange"]
]

У меня есть еще один массив строк, который должен быть отфильтрован массивом food:

let avoid = ["red", "yellow"]

Я хочу создать новый массив из массива food с объектами Fruit, которые не содержат любого из colors в массиве avoid. Так что в этом случае Apple не будет в массиве еды, потому что он содержит и red, и yellow.

Спасибо!

Что означает Fruit? Тип, протокол, псевдоним типа? что-то типа не помогает.

vadian 22.05.2019 09:48

имена переменных начинаются со строчной буквы. Имена типов начинаются с заглавной буквы. apple — это var Fruit — это тип. :D

Fogmeister 22.05.2019 09:48
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

struct Fruit {
    let name: String
    let colors: [String]
}

Создание массива food,

let apple = Fruit(name: "Apple", colors: ["red", "yellow", "green", "orange"])
let orange = Fruit(name: "Orange", colors: ["red", "green", "orange"])
let peach = Fruit(name: "Peach", colors: ["green", "orange"])
let pear = Fruit(name: "Pear", colors: [ "green"])
let food = [apple, orange, peach, pear]

Для filter массива food с использованием массива avoid мы можем использовать метод Setintersection, т.е.

let avoid = ["red", "yellow"]
let filteredFruits = food.filter { return Set($0.colors).intersection(avoid).isEmpty }
print(filteredFruits.map({ $0.name })) //["Peach", "Pear"]

filteredFruits будет содержать объекты - pear и peach

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

Fogmeister 22.05.2019 09:56

Это всего лишь пример. Как я уже сказал, он тоже мог принять это class. Мы не уверены в этом. class и struct всегда зависят от вашего варианта использования.

PGDev 22.05.2019 09:58

Именно поэтому здесь следует выбирать struct. Поскольку это то, что вы бы выбрали для этого примера, если бы писали его. Ничто здесь не нуждается в классе.

Fogmeister 22.05.2019 09:59

Идеально — это то, что я имел в виду :) И да, я забыл привести пример объекта Fruit.

sinio 22.05.2019 10:13
let res= food.filter(function(fruit) {
  return !fruit.colors.some(r=> avoid.indexOf(r) >= 0)
})

Пожалуйста, не могли бы вы расширить свой ответ более подробным объяснением? Это будет очень полезно для понимания. Спасибо!

vezunchik 22.05.2019 10:14

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

Не удается воспроизвести локальный аудиофайл mp3 с помощью AVAudioPlayer
Контроллер поиска в элементе навигации показывает черную полосу
Как исправить «Неустранимая ошибка: неожиданно найдено nil при неявном развертывании необязательного значения» при использовании tableview.reloaddata
Попытка отобразить имена пользователей моих пользователей из FirebaseStorage
Как получить номер строки в pickerview rowHeightForComponent?
«Обещание» неоднозначно для поиска типа в этом контексте
Мне нужно время от времени обновлять TableView, но при этом дублируются ячейки
Ограничения базы данных для игнорирования обратимо удаленных записей при оценке уникальности
Возникли проблемы с «достижением» моей функции подготовки переопределения для программного изменения представлений в контроллере панели вкладок
Как выполнить сообщение с помощью Alamofire (swift), чтобы получить токен безопасности в качестве возвращаемого значения