简体   繁体   English

Flutter/Dart- 过滤嵌套列表

[英]Flutter/Dart- Filter nested list

I want to filter out a list in Flutter/dart which has nested objects.我想过滤掉具有嵌套对象的 Flutter/dart 列表。 I want to filter out the list based on the name property both with in the parent object and the child object subNames.我想根据父 object 和子 object 子名称中的名称属性过滤掉列表。

Below is the code that I have come up with, which gives me duplicates, is there a better way to solve this?下面是我想出的代码,它给了我重复项,有没有更好的方法来解决这个问题?

    var rawData = [{
            "name": "Testing 123",
            "subNames": [{
                "name": "Subtesting 123"
            }]
        },
        {
            "name": "Testing 456",
            "subNames": [{
                "name": "Subtesting 456"
            }]
        },
        {
            "name": "Testing 456",
            "subNames": []
        }
    ]
        
     final results = [
                ...rawData
                    .where((m) =>
                        m.name.toLowerCase().contains('subtesting 123'))// or Testing 123
                    .toList(),
                ...rawData
                    .where((m) => m.subNames
                        .where((s) =>
                            s.name.toLowerCase().contains('subtesting 123')) // or Testing 123
                        .isNotEmpty)
                    .toList()
              ];

Expected output:
//Results
[{
        "name": "Testing 123",
        "subNames": [{
            "name": "Subtesting 123"
        }]
    }, 
]

Try changing your results to the following尝试将结果更改为以下内容

final results = [
  ...rawData
      .where((m) =>
          m.name.toLowerCase().contains('subtesting 123') 
            || m.subNames
          .where((s) =>
              s.name.toLowerCase().contains('subtesting 123')).toList().isNotEmpty)
      .toList(),
];

I'm assuming here you are parsing your rawData so you are able to use m.names instead of m['names']我在这里假设你正在解析你的 rawData 所以你可以使用m.names而不是m['names']

First of all, it's better to use Class models and typed variables over json or dynamic nested types.首先,最好使用 Class 模型和类型化变量,而不是 json 或动态嵌套类型。 Using this approach we can implement our logic easier.使用这种方法,我们可以更轻松地实现我们的逻辑。 Here is a sample:这是一个示例:

const rawData = [
  {
    "name": "Testing 123",
    "subNames": [
      {"name": "Subtesting 123"}
    ]
  },
  {
    "name": "Testing 456",
    "subNames": [
      {"name": "Subtesting 456"}
    ]
  },
  {"name": "Testing 456", "subNames": []}
];

class Model {
  String name;
  List<SubNames> subNames;

  Model({this.name, this.subNames});

  Model.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    if (json['subNames'] != null) {
      subNames = <SubNames>[];
      json['subNames'].forEach((v) {
        subNames.add(new SubNames.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    if (this.subNames != null) {
      data['subNames'] = this.subNames.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class SubNames {
  String name;

  SubNames({this.name});

  SubNames.fromJson(Map<String, dynamic> json) {
    name = json['name'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    return data;
  }
}

void main() {
  List<Model> testModelList = rawData.map((e) => Model.fromJson(e)).toList();
  final result = testModelList.where((element) =>
      element.name.toLowerCase().contains('subtesting 123') ||
      element.subNames
          .any((sub) => sub.name.toLowerCase().contains('subtesting 123')));
  print('result.length : ${result.length}');
  result.forEach((element) {
    print(element.toJson());
  });
}

You can run this sample see the result.您可以运行此示例查看结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM