Flutter-数组中具有相同名称的过滤器元素

时间:2019-05-17 11:10:47

标签: arrays flutter

我有一个包含多个元素的数组,其中一些元素具有相同的名称,并在数组中重复。我需要获取此数组的所有元素,仅获取重复元素和所有非重复元素中的一个。

我读过this document关于dart数组的知识,但没有太多帮助。我没有示例代码,我不知道我如何开始。

有人知道我该怎么做吗?

编辑:示例示例

一个简单的示例,请记住JSON中的许多错误。

[{'id': '19', fabricante: 'AA', modelo: 'h4000 DN100', 'configuracionRaw': 'CC', 'configuracion': {'emisor': '4', 'pw': '10.0', 'valorMomento': 'null', 'valorMaximo': '9999999.0', 'dataloggerPeriodoMin': '60', 'dataloggerHora': '08:00','fw': 'null','dataloggerPeriodoFTP': '1', 'dataloggerHoraFTP': '10', 'contadorParado': '240', 'alarmaPeriodo':'3', 'alarmaUmbral': '1000', 'alarmaEspontaneo': 'true'}, {'id': '20', fabricante: 'AA', modelo: 'h4000 DN100', 'configuracionRaw': 'CC', 'configuracion': {'emisor': '4', 'pw': '10.0', 'valorMomento': 'null', 'valorMaximo': '9999999.0', 'dataloggerPeriodoMin': '60', 'dataloggerHora': '08:00','fw': 'null','dataloggerPeriodoFTP': '1', 'dataloggerHoraFTP': '10', 'contadorParado': '240', 'alarmaPeriodo':'3', 'alarmaUmbral': '1000', 'alarmaEspontaneo': 'true'}} ]

代码示例

DataMaker是数据数组。

dataMaker.forEach((val) {
  print(val['fabricante']); //RETURN NAME
    if(filteredList!=val['fabricante']()){ //ERROR
    filteredList.add(val);
    }
  });

6 个答案:

答案 0 :(得分:0)

您可以通过Set

final newList = myList.toSet().toList();

答案 1 :(得分:0)

为什么不使用Set

void main() { 
   Set numberSet = new  Set(); 
   numberSet.add(20); 
   numberSet.add(20); 
   numberSet.add(5); 
   numberSet.add(60); 
   numberSet.add(70);


   for(var no in numberSet) { 
      print(no); 
   } 
} 

这将打印以下内容

20
5
60
70

答案 2 :(得分:0)

如果只想获取一组唯一的元素,则可以使用'set'或'foreach'

工作飞镖https://dartpad.dartlang.org/0a76f6dfe66a40b5e3f09ce74a739fe1

方法1

void main() {
  List list = [1,1,2,3,3,4,5,5,5,6,6];
  print(list.toSet().toList());
}

// answer
// [1, 2, 3, 4, 5, 6]

方法2

void main() {
List list = [1,1,2,3,3,4,5,5,5,6,6];
List filteredList = [];
list.forEach((val) {
    if(filteredList.indexOf(val) == -1){
    filteredList.add(val);
    }
  });
  print(filteredList);
}

// answer
// [1, 2, 3, 4, 5, 6]

答案 3 :(得分:0)

这看起来有点原始,但可以正常使用

List list = [2, 5, 7, 9, 22, 2, 7, 5, 9, 22, 6, 4, 7, 9, 2];
List nonRepetitive = [];

for (var i = 0; i < list.length; i++) {
  bool repeated = false;
  for (var j = 0; j < nonRepetitive.length; j++) {
    if (list[i] == nonRepetitive[j]) {
      repeated = true;
    }
  }
  if (!repeated) {
    nonRepetitive.add(list[i]);
  }
}
print(nonRepetitive);

这将返回

[2, 5, 7, 9, 22, 6, 4]

答案 4 :(得分:0)

您可以通过多种方式进行操作,例如可以使用 Array.fold

var withNoDuplications = yourArray.fold([], (current, next) {
     var elementExist = current.firstWhere((element) {
      return element['id'] == next['id'];
    }, orElse: () => null);

    if(elementExist == null) {
      current.add(next);
    }    
    return current;
  });
print(withNoDuplications);

另一种更详细的解决方案是使用 Class ,因为您首先需要使用json_serializable将JSON转换为常规类,然后覆盖 == < / strong>双重等于运算符。例如

class Person {
  String name;
  int age;
  Person({this.name, this.age});

  @override
  String toString() {
    return '$name $age';
  }

  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  Map<String, dynamic> toJson() => _$PersonToJson(this);

  bool operator ==(o) => o is Person && name == o.name && age == o.age;
  int get hashCode => name.hashCode + age.hashCode; //use a more reliable hashCode
}

通过这种方式,您可以使用前面的答案中提到的设置

List list = [Person(), Person(), Person()];
var result = list.toSet().toList() 

第二个选项更加详细,但从长远来看,我认为它更易于维护。
希望有帮助。

答案 5 :(得分:0)

Hosar,感谢您指出正确的方向!

尽管只需要添加@override装饰器/注释,我并不需要@json_serializable来获得toSet()支持。

class Person {
  String name;
  int age;
  Person({this.name, this.age});

  @override
  String toString() {
    return '$name $age';
  }

  @override
  bool operator ==(o) => o is Person && name == o.name && age == o.age;

  @override
  int get hashCode => name.hashCode + age.hashCode; //use a more reliable hashCode
}