在地图dart2中搜索,与list.indexOf相同?
我使用此示例在地图中搜索,但不工作:|:在地图dart2中搜索,与list.indexOf相同?,dart,dart-2,Dart,Dart 2,我使用此示例在地图中搜索,但不工作:|: 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')); // ? 但
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不是最后一行代码中的函数
请帮助我在地图中搜索对象,方法与indexOf
相同我找到了答案:
print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这个:
var ind = xmenObj.values.toList().indexOf('4xmen') ;
print(xmenObj.keys.toList()[ind]); // fifth
映射不能用整数进行索引,因此没有与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;
}
如果要查找所有匹配项,可以使用.where(…)
进行搜索;如果假设只有一个匹配项或只需要第一个匹配项,则可以使用firstWhere
进行搜索
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
这太复杂了,我需要一个简单的方法,我发现了这个。你不能假设键和值的顺序是相同的。在第二个示例中,如果xmenObj.keys.toList()[ind]
返回了正确的密钥,那么这只是运气使然。@GünterZöchbauer luck?你在开玩笑吧?但这个答案正好适合我的工作:)是的,纯粹是运气。您的解决方案建立在一个不保证为真的假设之上。实际上,DartHashMap
和LinkedHashMap
确实承诺迭代值等同于迭代键并查找相应的值。只要映射在迭代之间不改变,我们也保证迭代顺序是稳定的。显然,这是平台库地图唯一可以保证的东西,但一般来说是推荐的。谢谢,它对我很有效。你错了,它不简单:|,我只是说需要简单的方式而不是复杂的方式。
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);