我使用此示例在地图中进行搜索,而不是工作:|:
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
。
请帮助我在地图中搜索 object的简单方法和indexOf
一样。
发布于 2018-06-04 08:51:35
我找到了答案:
print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这样:
var ind = xmenObj.values.toList().indexOf('4xmen') ;
print(xmenObj.keys.toList()[ind]); // fifth
发布于 2018-06-04 15:59:30
映射不能通过整数进行索引,因此没有与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;
}
发布于 2018-06-05 10:46:46
如果要查找所有匹配项,则可以使用.where(...)
进行搜索;如果假设只有一个匹配项或只想要第一个匹配项,则可以使用firstWhere
进行搜索
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
https://stackoverflow.com/questions/50672254
复制相似问题