motokointernet-computerdfinity

How to traverse an inner array in motoko?


I am new to Motoko and internet computer, when I am working I am having too much difficulties that might look simple, I am having difficulties doing this, posting the link to forum question here

https://forum.dfinity.org/t/how-to-traverse-inner-array-of-a-trie/12941?u=manubodhi

Please help if somebody is well versed in Motoko and Dfinity


Solution

  • I prepared a small code in motoko playground for you in order to see how you can traverse inner array and achieve your goal of filtering Trie. Here is as well saved project in motoko playground: https://m7sm4-2iaaa-aaaab-qabra-cai.raw.ic0.app/?tag=1150943578

    Shortly to filter through inner array you can use:

    let trieOfDishes = Trie.filter<DishId, Dish>(dishes, func (k, v) {
        Array.find<MealTypeId>(v.mealTypeId, func(x : MealTypeId) { x == mealTypeId }) != null ;
    });
    

    Full code of canister implementation:

    import Trie "mo:base/Trie";
    import Array "mo:base/Array";
    import Iter "mo:base/Iter";
    import Nat32 "mo:base/Nat32";
    
    actor Dishes {
        
        type DishId = Nat32;
        type DishTypeId = Nat32;
        type MealTypeId = Nat32;
    
        public type Dish = {
            dishId: DishId;
            dishTypeId : DishTypeId;
            mealTypeId : [MealTypeId]
        };
    
        var dishes: Trie.Trie<DishId, Dish> = Trie.empty();
    
        private func key(x : DishId) : Trie.Key<DishId> {
            return { hash = x; key = x };
        };
        
        public func add_dish(dish: Dish) : async Dish {
            dishes := Trie.replace(dishes, key(dish.dishId), Nat32.equal, ?dish).0;
            return dish;
        };
    
        public query func getDishesByDishId (dishTypeId : DishTypeId) : async [(DishId, Dish)] {
           let trieOfDishes = Trie.filter<DishId, Dish>(dishes, func (k, v) { v.dishId == dishTypeId } );
           let arrayOfDishes : [(DishId, Dish)] = Iter.toArray(Trie.iter(trieOfDishes));
           return arrayOfDishes;
        };
    
        public query func getDishesBymealTypeId (mealTypeId : MealTypeId) : async [(DishId, Dish)] {
           let trieOfDishes = Trie.filter<DishId, Dish>(dishes, func (k, v) {
                Array.find<MealTypeId>(v.mealTypeId, func(x : MealTypeId) { x == mealTypeId }) != null ;
           });
           let arrayOfDishes : [(DishId, Dish)] = Iter.toArray(Trie.iter(trieOfDishes));
           return arrayOfDishes;
        };
        
    }