Фильтрация массива объектов с помощью внутреннего массива с другим массивом - PullRequest
0 голосов
/ 13 июня 2019

Давайте используем следующий пример кода для уточнения моего вопроса:

struct exampleObj {
    var str: String?
    var arr: [String]?
}

let filterArray = ["something1", "ins1", "something2"]

let obj1 = exampleObj(str: "obj1", arr: ["ins2", "ins3"])
let obj2 = exampleObj(str: "obj2", arr: ["ins1", "ins2"])
let obj3 = exampleObj(str: "obj3", arr: ["ins1", "ins4"])
let obj4 = exampleObj(str: "obj4", arr: ["ins3", "ins4"])

var arrayObj = [obj1, obj2, obj3, obj4]

let result = arrayObj.filter { filterArray.contains($0.arr...)} //??? I get lost here, dunno if right approach.

Я пытаюсь отфильтровать arrayObj с помощью другого массива filterArray, в результате чего получается result только с объектами типа exampleObj, содержащими ins1.

Я надеюсь, что все ясно.Любые сомнения по поводу вопроса, я здесь.

Ответы [ 4 ]

1 голос
/ 13 июня 2019

Вам нужно найти совпадения, где есть пересечение между значениями двух массивов. Это легче сделать с помощью наборов. Вам также нужно иметь дело с arr необязательно.

let result = arrayObj.filter { !Set(filterArray).intersection($0.arr ?? []).isEmpty }

Это будет более эффективно, если вы объявите filterArray как Set для начала.

let filterSet: Set = ["something1", "ins1", "something2"]

let obj1 = exampleObj(str: "obj1", arr: ["ins2", "ins3"])
let obj2 = exampleObj(str: "obj2", arr: ["ins1", "ins2"])
let obj3 = exampleObj(str: "obj3", arr: ["ins1", "ins4"])
let obj4 = exampleObj(str: "obj4", arr: ["ins3", "ins4"])

var arrayObj = [obj1, obj2, obj3, obj4]

let result = arrayObj.filter { !filterSet.intersection($0.arr ?? []).isEmpty }
1 голос
/ 13 июня 2019

Вы можете просто сделать, найдя non-empty intersection между filterArray и exampleObj's arr, то есть

let filterSet = Set(filterArray)
let result = arrayObj.filter { (exampleObj) -> Bool in
    if let arr = exampleObj.arr {
        return !filterSet.intersection(arr).isEmpty
    }
    return false
}

Выход: result содержит obj1 иobj2.

1 голос
/ 13 июня 2019

Попробуйте:

let result = arrayObj.filter { obj in
    filterArray.contains { filter in
        obj.arr?.contains(filter) ?? false
    }
}

или используйте Set:

let result = arrayObj.filter { !Set(filterArray).isDisjoint(with: $0.arr ?? []) }
0 голосов
/ 13 июня 2019

Попробуйте это

let result = arrObj.filter{ $0.arr.contains{ where : $0 as? String ?? "" == "ins1"} }
...