【问题标题】:Dart/Flutter How to compare and merge into one from two List of model?Dart/Flutter 如何比较并合并到两个模型列表中的一个?
【发布时间】:2021-02-26 09:44:39
【问题描述】:

如何在 Dart/Flutter 中比较两个模型列表并将答案值合并为一个?

class Questions {
  dynamic id;
  final String label;
  final String description;
  String answerText;

  Questions({
    this.id,
    this.label,
    this.description,
    this.answerText,
  });

 List<Questions> q1 = [Question(1, 'This is question 1', 'first_question',''), Question(2, 'This is question 2','second_question',''),Question(3, 'This is question 3', 'third',''), Question(4, 'This is question 4', 'fourth',''),Question(5, 'This is question 5', 'fifth',''), Question(6, 'This is question 6', 'sixth','')]; 

 List<Questions> q2 = [Question(1,'answer for question 1'), Question(3,'answer for question 3'), Question(5,'answer for question 5')];

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我想您想将答案合并到问题中,如下所示:

    1: This is question 1
    Desc: first_question
    Answer:answer for question 1
    
    2: This is question 2
    Desc: second_question
    Answer:Missing answer
    
    3: This is question 3
    Desc: third
    Answer:answer for question 3
    
    4: This is question 4
    Desc: fourth
    Answer:Missing answer
    
    5: This is question 5
    Desc: fifth
    Answer:answer for question 5
    
    6: This is question 6
    Desc: sixth
    Answer:Missing answer
    
    

    这是在QuestionList 上使用map 的解决方案:

    void main() {
      List<Question> combined = questions
          .map((question) => question
              ..answerText =
                answers.firstWhere((answer) => answer.id == question.id, orElse: () => null)?.answerText ?? 'Missing answer')
          .toList();
      combined.forEach((question) => print(question));
    }
    
    class Question {
      dynamic id;
      final String label;
      final String description;
      String answerText;
    
      Question({
        this.id,
        this.label,
        this.description,
        this.answerText,
      });
      
      toString() => '$id: $label\nDesc: $description\nAnswer:$answerText\n';
    }
    
    List<Question> questions = [
      Question(id: 1, label: 'This is question 1', description: 'first_question'),
      Question(id: 2, label: 'This is question 2', description: 'second_question'),
      Question(id: 3, label: 'This is question 3', description: 'third'),
      Question(id: 4, label: 'This is question 4', description: 'fourth'),
      Question(id: 5, label: 'This is question 5', description: 'fifth'),
      Question(id: 6, label: 'This is question 6', description: 'sixth'),
    ];
    
    List<Question> answers = [
      Question(id: 1, answerText: 'answer for question 1'),
      Question(id: 3, answerText: 'answer for question 3'),
      Question(id: 5, answerText: 'answer for question 5'),
    ];
    

    【讨论】:

    • 我尝试了您的解决方案如下:List&lt;Question&gt; combined = q1.map((question) =&gt; question.answerText = q2.firstWhere((answer) =&gt; answer.id == question.id, orElse: () =&gt; null)?.answerText ?? '').toList(); 它说如下。不能将“List”类型的值分配给“List”类型的变量。尝试更改变量的类型,或将右侧类型转换为“List”。
    • 注意,我用的是 Dart 的cascade notationquestion.answeredText = 'answer' 将返回字符串 'answer',而 question..answeredText = 'answer' 将返回实体 question
    【解决方案2】:

    使用darq包,有set操作有except、intersect、union方法。

    例子

    var listA = [1, 2, 3, 4];
    var listB = [3, 4, 5, 6];
    
    var exclusion = listA.except(listB);       // [1, 2]
    var intersection = listA.intersect(listB); // [3, 4]
    var union = listA.union(listB);            // [1, 2, 3, 4, 5, 6]
    

    【讨论】:

    • 谢谢,但我不想为此使用额外的包。
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2014-03-16
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多