You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

比较List<Map<String, Object>>相同结果却返回false的问题

问题原因及解决办法

核心原因

Dart中的Map属于引用类型,默认的==运算符比较的是两个对象的内存引用地址,而非它们的内容。你代码里orderList[0]是一个已存在的Map实例,而{"Nasi Goreng": 1}是点击按钮时新创建的另一个Map实例——两者内容完全一致,但内存地址不同,因此==返回false,进而导致assert失败、contains找不到元素、indexOf返回-1。

解决办法

要比较两个Map的内容是否相等,有两种常用方式:

1. 使用官方提供的mapEquals函数

导入dart:collection库后,调用mapEquals方法直接比较Map内容:

import 'dart:collection';

// ...

ElevatedButton(onPressed: () {
  print(orderList);
  assert(mapEquals(orderList[0], {"Nasi Goreng": 1}));
}, child: Text("+"))

2. 手动实现内容比较逻辑

如果不想导入额外库,可以自己写一个比较函数:

bool compareMaps(Map<String, Object> a, Map<String, Object> b) {
  if (a.length != b.length) return false;
  for (final key in a.keys) {
    if (!b.containsKey(key) || a[key] != b[key]) {
      return false;
    }
  }
  return true;
}

// ...

ElevatedButton(onPressed: () {
  print(orderList);
  assert(compareMaps(orderList[0], {"Nasi Goreng": 1}));
}, child: Text("+"))

对于contains和indexOf方法,同样需要基于内容比较来判断,比如可以用any方法替代contains:

// 判断orderList中是否包含内容匹配的Map
bool hasMatch = orderList.any((map) => mapEquals(map, {"Nasi Goreng": 1}));

内容的提问来源于stack exchange,提问作者Arya Suwandika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:47:09