Сравните два массива, которые включают словарь и массив - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующий массив, который содержит искомый продукт пользователем; После поиска теги продукта также сохраняются в массиве searchTags, как показано ниже:

searchedTags = [ [product : [tagA, tagB, tagC, tagD, tagH ]] ]

Теперь у меня есть список массивов всех продуктов, который содержит различные теги для каждого продукта:

productTagsArray = [ [product1 : [tagA, tagB, tagC, tagD]],
                [product2 : [tagC, tagD, tagE, tagF, tag H]], 
                [product3 : [tagH, tagI, tagJ]],
                [product4 : [tagK, tagL, tagM]],
                ...
              ] 

Теперь я хотел бы проверить и сравнить теги из найденного продукта в searchedTags с каждым продуктом в productTagsArray. После сравнения я хотел бы создать новый массив товаров, отсортированных по КОЛИЧЕСТВАМ тегов, сопоставленных (по убыванию) с найденными товарами. Если метки не совпадают, я не хочу включать их в новую переменную. Я хотел бы заполнить результат этого отсортированного соответствия, как показано ниже:

sortedProductsByCount = [[productId : product1, numberOfTagsMatched : 4],
                        [productId : product2, numberOfTagsMatched : 2],
                        [productId : product1, numberOfTagsMatched : 1]
                        ]

Редактировать: Это то, для чего я написал, когда пользователь нажимает на результат поиска в табличном представлении:

var productsTagCount: [[String:Any]] = [[:]]

    for tags in searchedProductTags {
        for tag in tags {
            for productArray in productTagsArray {
                for product in productArray {

                    var tagCount: Int = 0

                    for productTag in product.value {
                        if productTag == tag {
                            tagCount = tagCount + 1
                        }
                    }

                    let data: [String : Any] = [
                        "productId": product.key,
                        "tagCount": tagCount
                    ]

                    productsTagCount.append(data)

                }
            }
        }
    }

Есть ли лучший способ? Как я могу выполнить sh массив sortedProductByCount?

1 Ответ

0 голосов
/ 11 апреля 2020

Вот как я это исправил. Мне пришлось немного изменить мои коды.

var productTagsArray : [[String : [String]]] = [[:]]
var productTagCount : [String : Int] = [:]
var sortedProductTagCount: [Int : [String : Int]] = [:]


let searchedProductTags = searchResults[indexPath.row].values

    for productArray in productTagsArray {
        for product in productArray {

            let productId: String = product.key
            var tagCount: Int = 0

            for productTag in product.value {

                for searchedTags in searchedProductTags {
                    for searchedTag in searchedTags {

                        if productTag == searchedTag {
                            tagCount = tagCount + 1
                        }
                    }
                }
            }

            if tagCount != 0 {                    
                productTagCount[productId] = tagCount                    
            }
        }
    }

    //Make an array with sorted tagscount
    let sortedProductTagCountVar = productTagCount.sorted{ $0.value > $1.value }
    var productSortIndex: Int = 0

    for (k,v) in sortedProductTagCountVar {
        productSortIndex = productSortIndex + 1
        sortedProductTagCount[productSortIndex, default: [:]][k] = v
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...