对象的数组
输入:
[
{id:1,order:1},
{id:2,order:null},
{id:3,order:0},
{id:4,order:null},
{id:5,order:3}
]
输出:
[
{id:3,order:0},
{id:1,order:1},
{id:2,order:null},
{id:5,order:3},
{id:4,order:null}
]
考虑模型
Item(int id,int? Order)
默认情况下,订单为空,这些位置将被保留,具有订单的对象将被上移或下移。
如果数组类型为Map-,请尝试此操作
arrayOfObjects.sort((a, b) => a['order'].compareTo(b['order']));
或者,如果它持有具有订单属性的Item类
arrayOfObjects.sort((Item a, Item b) => a.order.compareTo(b.order));
注意-在运行排序之前,您可以删除订单为空的项目。
示例
arrayOfObjects.removeWhere((item)=> item.order == null);
双迭代基于处理null的数组的长度。解决方案
import 'package:collection/collection.dart';
class Item {
int? _id;
int? _order;
Item({int? id, int? order}) {
this._id = id;
this._order = order;
}
int? get id => _id;
set id(int? id) => _id = id;
int? get order => _order;
set order(int? order) => _order = order;
Item.fromJson(Map<String, dynamic> json) {
_id = json['id'];
_order = json['order'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this._id;
data['order'] = this._order;
return data;
}
}
List<Item> reorder(List<Item> it){
var tempData = it;
tempData.forEach((_){
tempData.forEachIndexed((index,val){
///Remove original and replace
var ind = val.order;
if(ind!=null){
///Check if it is at the Proper Position
if (index == ind) {
return;
}
var first = it.removeAt(index);
it.insert(ind as int, first);
}
});
});
return it;
}
void main() {
var list = [
Item(id: 1, order: 1),
Item(id: 3, order: 2),
Item(id: 2, order: 7),
Item(id: 4, order: null),
Item(id: 5, order: null),
Item(id: 6, order: null),
Item(id: 7, order: 6),
Item(id: 8, order: 4)
];
list.forEach((it) => print('${it.id} ->${it.order}'));
var first = reorder(list);
print('n');
first.forEach((it) => print('${it.id} ->${it.order}'));
///Stack List
}