如何在swift 4中基于另一个对象数组过滤对象数组

时间:2018-04-13 13:28:17

标签: arrays swift filter swift4

这是我的两个数组

 Arrayone = [{keyphraseId:"tcpid1234",name:"shakti"},{keyphraseId:"tcpid456",name:"shakti"},{keyphraseId:"tcpid897",name:"srichandan "},{keyphraseId:"tcpid779",name:"prakash"}]

Arraytwo  = [{idstring:"tcpid1234",name:"shakti"},{idstring:"tcpid456",name:"shakti"}]

我想在数组2的基础上过滤数组一,即(我想得到数组1的所有元素,其中没有数组二中的idstring

2 个答案:

答案 0 :(得分:3)

如果你不介意O(n ^ 2),那么直接一步测试。

let arrayOne = [["keyphraseId":"tcpid1234", "name":"shakti"], ["keyphraseId":"tcpid456", "name":"shakti"], ["keyphraseId":"tcpid897", "name":"srichandan "], ["keyphraseId":"tcpid779", "name":"prakash"]]
let arrayTwo = [["idstring":"tcpid1234", "name":"shakti"],["idstring":"tcpid456", "name":"shakti"]]

arrayOne.filter { one in
    !arrayTwo.contains { two in
        one["keyphraseId"] == two["idstring"]
    }
}

如果您想要更好的性能O(n),请将stringid放入集合

let arrayOne = [["keyphraseId":"tcpid1234", "name":"shakti"], ["keyphraseId":"tcpid456", "name":"shakti"], ["keyphraseId":"tcpid897", "name":"srichandan "], ["keyphraseId":"tcpid779", "name":"prakash"]]
let arrayTwo  = [["idstring":"tcpid1234", "name":"shakti"],["idstring":"tcpid456", "name":"shakti"]]

let idstrings = Set(arrayTwo.flatMap { $0["idstring"] })

arrayOne.filter {
    guard let keyphraseId = $0["keyphraseId"] else { return false }
    return !idstrings.contains(keyphraseId)
}

答案 1 :(得分:2)

您有2个数组,如下所示:

idStrings
  

要过滤数组,您需要执行以下两个步骤:

     
      
  1. arrayTwo

  2. 列出arrayOne   
  3. 过滤idString并在步骤1中抓取keyphraseId

  4.   

从arrayOne获取元素

idstring位于arrayTwo中 let arrayTwoIds = arrayTwo.map { $0["idstring"] } let filteredResults = arrayOne.filter { arrayTwoIds.contains($0["keyphraseId"]) } print(filteredResults)

keyphraseId

idstring不在于arrayTwo !

只需将 let filteredResults = arrayOne.filter { !arrayTwoIds.contains($0["keyphraseId"]) } 置于过滤条件:

{{1}}

希望这会有所帮助。