我使用此示例在地图中搜索但不工作:|:
var xmenList = ['4','xmen','4xmen','test'];
var xmenObj = {
'first': '4',
'second': 'xmen',
'fifth': '4xmen',
'author': 'test'
};
print(xmenList.indexOf('4xmen')); // 2
print(xmenObj.indexOf('4xmen')); // ?
但我在最后一个代码行上有错误TypeError: xmenObj.indexOf$1 is not a function
。
请帮助我搜索 地图对象与indexOf
相同的简单方法。
答案 0 :(得分:0)
我找到了答案:
print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这个:
var ind = xmenObj.values.toList().indexOf('4xmen') ;
print(xmenObj.keys.toList()[ind]); // fifth
答案 1 :(得分:0)
地图不能按整数编制索引,因此没有与indexOf
对应的操作。如果您将列表视为专用映射,其中键始终是连续的整数,则相应的操作应找到给定值的键。
地图不是为此而构建的,因此迭代所有键和值是获得该结果的唯一方法。
我这样做是:
K keyForValue<K, V>(Map<K, V> map, V value) {
for (var entry in map.entries) {
if (entry.value == value) return key;
}
return null;
}
Dart 2中引入了entries
getter。如果你没有,那么使用map.values.toList().indexOf(value)
获取迭代位置,然后使用map.keys.elementAt(thatIndex)
获取相应的密钥。
如果你真的只想要数字索引,那么你可以跳过最后一步。 效率不高(您分配新列表并复制所有值)。另一种方法是:
int indexOfValue<V>(Map<Object, V> map, V value) {
int i = 0;
for (var mapValue in map.values) {
if (mapValue == value) return i;
i++;
}
return -1;
}
答案 2 :(得分:0)
如果您想查找所有匹配项,可以使用.where(...)
进行搜索;如果您认为只有一个匹配项,则可以使用firstWhere
进行搜索
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);