如何通过属性从dart中的对象列表中查找对象?
您好,我是dart新手,尝试在列表中按属性名称查找项目如何通过属性从dart中的对象列表中查找对象?,dart,Dart,您好,我是dart新手,尝试在列表中按属性名称查找项目 class Product{ String id; String title; Product(this.id,this.title); } void main(){ List<List<Product>> allProdcuts=[ //New Prodcuts [ Product("1","Hammer"),
class Product{
String id;
String title;
Product(this.id,this.title);
}
void main(){
List<List<Product>> allProdcuts=[
//New Prodcuts
[
Product("1","Hammer"),
Product("3","Nails"),
Product("2","Screws"),
],
futureItems,
//Old Prodcuts
[
Product("4","Rock"),
Product("5","Paper"),
Product("6","Scissor"),
],
//Rare Items
[
Product("7","Plank"),
Product("8","Wires"),
Product("9","Box"),
],
];
print(allProdcuts.where((itemsList)=>itemsList.contains((product)=>product.title='Wires')));
//Returns ()
}
但有一个元素的标题是“钉子”。我不明白我做错了什么。有很多方法可以解决这个问题 一个例子是使用以下方法:
allProdcuts.forEach(
(列表l)=>l.forEach(
(产品p){
如果(p.标题=“钉子”)
印刷品(p.id);
}
)
);
for each方法接收一个函数,并将该函数应用于列表中的每个元素。如果您有一个列表列表,则可以执行两次,以将函数应用于子列表的每个元素
上面的代码打印3
,这是所需的结果
另一个解决方案是先将列表展平,以便以后进行更轻松的搜索。有很多方法可以解决这个问题 一个例子是使用以下方法:
allProdcuts.forEach(
(列表l)=>l.forEach(
(产品p){
如果(p.标题=“钉子”)
印刷品(p.id);
}
)
);
for each方法接收一个函数,并将该函数应用于列表中的每个元素。如果您有一个列表列表,则可以执行两次,以将函数应用于子列表的每个元素
上面的代码打印3
,这是所需的结果
另一种解决方案是先将列表展平,以便以后进行更轻松的搜索。您正在调用
itemList.firstWhere((p)=>p.title='Nails')
在每个列表上,也包括那些没有标题元素的列表“Nails”
。由于firstWhere
在没有匹配值的情况下抛出,因此它会对三个列表中的两个执行该操作。另外,在示例中,itemsList.contains(…)
不接受回调,因此您只需检查一个函数是否在列表中,而它不在列表中。您可能想使用any
,但这并不能解决问题
为了有效地执行此操作,我可能会创建助手函数:
Product findbytle(列出所有产品,字符串标题){
对于(所有产品中的var产品){
用于(产品中的var产品){
如果(product.title==title)返回产品;
}
}
//或者返回'null'。
抛出ArgumentError.value(标题“title”,“没有具有该标题的元素”);
}
<代码>返回中间允许您在匹配的时候跳过双迭代,更难与<代码>第一个地方< <代码> >代码> map < /代码> />代码>前缀等
一种替代解决办法是:var product=allProducts.expand((l)=>l.where((p)=>p.title==title))。首先;
它将查找具有给定标题的所有产品,并将其展平为单个iterable,然后选择第一个(如果有)。因为iterables是惰性的,它实际上会在第一次匹配时停止。您正在调用
itemList.firstWhere((p)=>p.title='Nails')
在每个列表上,也就是没有title元素的列表。由于firstWhere
在没有匹配值的情况下抛出,因此它会对三个列表中的两个执行该操作。另外,在示例中,itemsList.contains(…)
不接受回调,因此您只需检查一个函数是否在列表中,而它不在列表中。您可能想使用any
,但这并不能解决问题
为了有效地执行此操作,我可能会创建助手函数:
Product findbytle(列出所有产品,字符串标题){
对于(所有产品中的var产品){
用于(产品中的var产品){
如果(product.title==title)返回产品;
}
}
//或者返回'null'。
抛出ArgumentError.value(标题“title”,“没有具有该标题的元素”);
}
<代码>返回中间允许您在匹配的时候跳过双迭代,更难与<代码>第一个地方< <代码> >代码> map < /代码> />代码>前缀等
一种替代解决办法是:var product=allProducts.expand((l)=>l.where((p)=>p.title==title))。首先;
它将查找具有给定标题的所有产品,并将其展平为单个iterable,然后选择第一个(如果有)。因为iterables是懒惰的,它实际上会在第一场比赛时停止
List<Product> futureItems= [
Product("101","Galactic Hammer"),
Product("301","Galactic Nails"),
Product("201","Galactic Screws"),
];
print(newProduct.firstWhere((p)=>p.title=='Hammer'));
//Instance of 'Product'
print(allProdcuts.map((itemList)=>itemList.firstWhere((p)=>p.title=='Nails')));
// Bad state: No elementError: Bad state: No element.
allProdcuts.forEach(
(List<Product> l)=>l.forEach(
(Product p){
if (p.title=="Nails")
print(p.id);
}
)
);