programing

배열에서 개체를 찾으시겠습니까?

showcode 2023. 6. 4. 10:42
반응형

배열에서 개체를 찾으시겠습니까?

Swift에 _.find in Underscore.js와 같은 것이 있습니까?

나는 일련의 유형의 구조를 가지고 있습니다.T그리고 배열에 다음과 같은 구조 객체가 포함되어 있는지 확인하고 싶습니다.name속성은 다음과 같습니다.Foo.

사용하려고 했습니다.find()그리고.filter()하지만 그들은 오직 원시적인 유형, 예를 들어.String또는Int다음을 준수하지 않는 오류를 발생시킵니다.Equitable프로토콜 같은 것.

스위프트 5

요소가 있는지 확인합니다.

if array.contains(where: {$0.name == "foo"}) {
   // it exists, do something
} else {
   //item could not be found
}

요소 가져오기

if let foo = array.first(where: {$0.name == "foo"}) {
   // do something with foo
} else {
   // item could not be found
}

요소 및 해당 간격띄우기를 가져옵니다.

if let foo = array.enumerated().first(where: {$0.element.name == "foo"}) {
   // do something with foo.offset and foo.element
} else {
   // item could not be found
}

오프셋 가져오기

if let fooOffset = array.firstIndex(where: {$0.name == "foo"}) {
    // do something with fooOffset
} else {
    // item could not be found
}

사용할 수 있습니다.index사용 가능한 방법Array술어를 사용한 경우(여기서 Apple 설명서 참조).

func index(where predicate: (Element) throws -> Bool) rethrows -> Int?

구체적인 예는 다음과 같습니다.

스위프트 5.0

if let i = array.firstIndex(where: { $0.name == "Foo" }) {
    return array[i]
}

스위프트 3.0

if let i = array.index(where: { $0.name == Foo }) {
    return array[i]
}

스위프트 2.0

if let i = array.indexOf({ $0.name == Foo }) {
    return array[i]
}

FWIW, 사용자 지정 기능이나 확장 기능을 사용하지 않으려면 다음을 수행할 수 있습니다.

let array = [ .... ]
if let found = find(array.map({ $0.name }), "Foo") {
    let obj = array[found]
}

이는 생성됩니다.name먼저 배열한 다음find그것으로부터.

대규모 어레이를 사용하는 경우 다음 작업을 수행할 수 있습니다.

if let found = find(lazy(array).map({ $0.name }), "Foo") {
    let obj = array[found]
}

또는 아마도:

if let found = find(lazy(array).map({ $0.name == "Foo" }), true) {
    let obj = array[found]
}

스위프트 3

개체가 필요한 경우 다음을 사용합니다.

array.first{$0.name == "Foo"}

("Foo"라는 이름의 개체가 두 개 이상 있는 경우first지정되지 않은 주문에서 첫 번째 개체를 반환합니다.)

배열에서 속성이 있는 개체 찾기에 표시된 대로 배열을 필터링한 다음 첫 번째 요소를 선택할 수 있습니다.

또는 사용자 정의 확장을 정의합니다.

extension Array {

    // Returns the first element satisfying the predicate, or `nil`
    // if there is no matching element.
    func findFirstMatching<L : BooleanType>(predicate: T -> L) -> T? {
        for item in self {
            if predicate(item) {
                return item // found
            }
        }
        return nil // not found
    }
}

사용 예:

struct T {
    var name : String
}

let array = [T(name: "bar"), T(name: "baz"), T(name: "foo")]

if let item = array.findFirstMatching( { $0.name == "foo" } ) {
    // item is the first matching array element
} else {
    // not found
}

스위프트 3에서는 기존의first(where:)방법(댓글에 언급된 대로):

if let item = array.first(where: { $0.name == "foo" }) {
    // item is the first matching array element
} else {
    // not found
}

스위프트 3.0

if let index = array.index(where: { $0.name == "Foo" }) {
    return array[index]
}

스위프트 2.1

이제 swift 2.1에서 개체 속성 필터링이 지원됩니다.다음은 구조자 클래스의 값을 기준으로 배열을 필터링할 수 있는 예입니다.

for myObj in myObjList where myObj.name == "foo" {
 //object with name is foo
}

OR

for myObj in myObjList where myObj.Id > 10 {
 //objects with Id is greater than 10
}

스위프트 4,

필터 기능을 사용하여 이를 달성하는 또 다른 방법은,

if let object = elements.filter({ $0.title == "title" }).first {
    print("found")
} else {
    print("not found")
}

스위프트 3

Swift 3에서 인덱스(위치:)를 사용할 수 있습니다.

func index(where predicate: @noescape Element throws -> Bool) rethrows -> Int?

if let i = theArray.index(where: {$0.name == "Foo"}) {
    return theArray[i]
}

스위프트 2 이상

결합할 수 있습니다.indexOf그리고.map한 줄로 "요소 찾기" 함수를 작성합니다.

let array = [T(name: "foo"), T(name: "Foo"), T(name: "FOO")]
let foundValue = array.indexOf { $0.name == "Foo" }.map { array[$0] }
print(foundValue) // Prints "T(name: "Foo")"

사용.filter+first더 깨끗해 보이지만,filter배열의 모든 요소를 평가합니다. indexOf+map복잡해 보이지만 배열에서 첫 번째 일치 항목이 발견되면 평가가 중지됩니다.두 가지 접근법 모두 장단점이 있습니다.

array.index(of: Any)에 액세스하는 또 다른 방법은 개체를 선언하는 것입니다.

import Foundation
class Model: NSObject {  }

스위프트 3

if yourArray.contains(item) {
   //item found, do what you want
}
else{
   //item not found 
   yourArray.append(item)
}

사용하다contains:

var yourItem:YourType!
if contains(yourArray, item){
    yourItem = item
}

아니면 마틴이 당신을 가리킨 것을 댓글로 시도해 볼 수도 있고,filter다른 시도: 배열에서 속성이 있는 개체 찾기.

스위프트 3:

내장된 스위프트 기능을 사용하여 배열에서 사용자 지정 개체를 찾을 수 있습니다.

먼저 사용자 지정 개체가 동등한 프로토콜을 준수하는지 확인해야 합니다.

class Person : Equatable { //<--- Add Equatable protocol
    let name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    //Add Equatable functionality:
    static func == (lhs: Person, rhs: Person) -> Bool {
        return (lhs.name == rhs.name)
    }
}

개체에 동등한 기능이 추가되면 Swift가 배열에서 사용할 수 있는 추가 속성을 표시합니다.

//create new array and populate with objects:
let p1 = Person(name: "Paul", age: 20)
let p2 = Person(name: "Mike", age: 22)
let p3 = Person(name: "Jane", age: 33)
var people = [Person]([p1,p2,p3])

//find index by object:
let index = people.index(of: p2)! //finds Index of Mike

//remove item by index:
people.remove(at: index) //removes Mike from array

스위프트 3의 경우,

let index = array.index(where: {$0.name == "foo"})

Swift의 경우 Lo-Dash 또는 Underscore.js인 달러를 사용합니다.

import Dollar

let found = $.find(array) { $0.name == "Foo" }

예를 들어, 숫자 배열이 있는 경우:

let numbers = [2, 4, 6, 8, 9, 10]

다음과 같은 첫 번째 홀수를 찾을 수 있습니다.

let firstOdd = numbers.index { $0 % 2 == 1 }

첫 번째 홀수(9)가 인덱스 4에 있기 때문에 4를 선택적 정수로 반환합니다.

언급URL : https://stackoverflow.com/questions/28727845/find-an-object-in-array

반응형