我有一个包含多个元素的数组,其中一些元素具有相同的名称,并在数组中重复。我需要获取此数组的所有元素,仅获取重复元素和所有非重复元素中的一个。
我读过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);
}
});
答案 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
}