代码之家  ›  专栏  ›  技术社区  ›  Valeriy

在结构中的数组中搜索数组结构

  •  1
  • Valeriy  · 技术社区  · 8 年前

    帮助我在数组中查找数组。在这个实现中,我返回整个数组。

    [(name: "Bell 2", arr: [arrSub(sub_txt: "Test 2, 1"),arrSub(sub_txt: "Test 2, 2")])]
    

    我要回去:

    [(name: "Bell 2", arr: [arrSub(sub_txt: "Test 2, 2")])]
    

    //操场

    import UIKit
    
    struct arrSub {
        let sub_txt: String
    }
    
    struct test {
        let name: String
        let arr: [arrSub]
    
        init(name: String, arr: [arrSub]) {
            self.name = name
            self.arr  = arr
        }
    }
    
    var testArr = [test]()
    
    testArr.append(test(name: "Line 1", arr: [arrSub(sub_txt: "Line 1, 1"), arrSub(sub_txt: "Line 1, 2")]))
    testArr.append(test(name: "Bell 2", arr: [arrSub(sub_txt: "Bell 2, 1"), arrSub(sub_txt: "Bell 2, 2")]))
    testArr.append(test(name: "Bell 2", arr: [arrSub(sub_txt: "Test 2, 1"), arrSub(sub_txt: "Test 2, 2")]))
    
    let new = testArr.filter({
        $0.arr.contains(where: { $0.sub_txt.contains("Test 2, 2") } )        
    })
    
    print(new)
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   Dávid Pásztor    8 年前

    一个简单的 filter 不会帮助您实现目标,因为您正在尝试修改 test 通过过滤实例 arr 属性。你可以用 compactMap 而不是 滤波器 返回修改的 测试 实例以防它们满足 滤波器 标准或 nil 如果他们没有,而且 紧凑地图 只保留非零值。

    let new = testArr.compactMap({ test->Test? in
    let foundArrSub = test.arr.filter({ $0.sub_txt.contains("Test 2, 2") })
        if foundArrSub.count > 0 {
            return Test(name: test.name, arr: foundArrSub)
        }
        return nil
    })
    

    测试数据:

    var testArr = [Test]()
    
    testArr.append(Test(name: "Line 1", arr: [ArrSub(sub_txt: "Line 1, 1"), ArrSub(sub_txt: "Line 1, 2")]))
    testArr.append(Test(name: "Bell 2", arr: [ArrSub(sub_txt: "Bell 2, 1"), ArrSub(sub_txt: "Bell 2, 2")]))
    testArr.append(Test(name: "Bell 2", arr: [ArrSub(sub_txt: "Test 2, 1"), ArrSub(sub_txt: "Test 2, 2"),ArrSub(sub_txt: "Test 2, 23")]))
    

    [uulldb_expr_1.测试(名称:“Bell 2”,arr:[lldb_expr_1.arr sub(sub_txt:“测试2,2”),lldb_expr_1.arrsub(sub_txt:“测试2,23”))]

    您应该遵守swift命名约定,这是类型的大写字母,所以我更改了 测试 到 Test 和 arrSub 到 ArrSub .

        2
  •  0
  •   Valeriy    8 年前

    谢谢,@d Vid P_sztor。我只是稍微更正一下

    let new = testArr.compactMap { (myTest) -> test? in
    if let foundArrSub = myTest.arr.first(where: { $0.sub_txt.contains("Test 2, 2") }){
        return test(name: myTest.name, arr: [foundArrSub])
    }
    return nil} 
    

    此搜索将只在子结构中找到一条记录。但是我需要返回所有与搜索条件相等的元素。

        3
  •  0
  •   Abdelahad Darwish    8 年前

    你可以用 reduce 也

    let news =  testArr.reduce([test]()) { (result, testObj) -> [test] in
    
                let internalArray  = testObj.arr.filter({ (arraySub) -> Bool in
                    return   arraySub.sub_txt.range(of:"Test 2, 2") != nil
                }).filter({ (arraySub) -> Bool in
                    return   arraySub.sub_txt.range(of:"Test 2, 2") != nil
                })
            if internalArray.count > 0 {
                return result + [test.init(name: testObj.name, arr: internalArray)]
            }else{
                return result
            }
        }
    
        print(news)