【问题标题】:How to traverse an inner array in motoko?如何遍历motoko中的内部数组?
【发布时间】:2022-05-13 17:45:10
【问题描述】:

我是motoko和互联网计算机的新手,当我工作时,我遇到了太多看起来很简单的困难,我在做这件事时遇到了困难,在这里发布论坛问题的链接

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

如果有人精通motoko和difinity,请提供帮助

    标签: motoko internet-computer dfinity


    【解决方案1】:

    我在motoko playground中为你准备了一个小代码,以便了解如何遍历内部数组并实现过滤Trie的目标。这是motoko操场上保存的项目:https://m7sm4-2iaaa-aaaab-qabra-cai.raw.ic0.app/?tag=1150943578

    很快要过滤内部数组,您可以使用:

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

    容器实现的完整代码:

    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;
        };
        
    }
    

    【讨论】:

    • 非常感谢你!我真的想学习所有这些!您尝试学习所有这些项目的哪些项目,我正在为 motoko 中糟糕的文档和缺乏中间示例而苦苦挣扎。再一次感谢你 :)
    • 没问题,不幸的是,有时motoko的文档很难阅读,因为它位于不同的地方,并且可能会有一些更有用的示例项目。如果您遇到一些问题,我建议您在motoko游乐场玩,并尝试尽可能轻松地做到这一点。有时如果你卡住了,你可以从 DFINITY 找到一些演示项目来获得一些灵感:)
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多