如何通过属性从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"),

您好,我是dart新手,尝试在列表中按属性名称查找项目

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);
                                     }
                                )
);