在地图 dart2 中搜索,与 list.indexOf 相同?
search in maps dart2 , same as list.indexOf?
我使用此示例在地图中进行搜索但不起作用:|:
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 is not a function
。
请帮助我在 map 对象中 search 简单方法与 indexOf
.
相同
我找到了答案:
print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这个:
var ind = xmenObj.values.toList().indexOf('4xmen') ;
print(xmenObj.keys.toList()[ind]); // fifth
Maps不能用整数索引,所以没有indexOf
对应的操作。如果您将列表视为其中键始终是连续整数的专用映射,则相应的操作应该找到给定值的 key。
地图不是为此而构建的,因此遍历所有键和值是获得该结果的唯一方法。
我会这样做:
K keyForValue<K, V>(Map<K, V> map, V value) {
for (var entry in map.entries) {
if (entry.value == value) return key;
}
return null;
}
entries
getter 是在Dart 2中引入的,如果你没有那个,那么使用 map.values.toList().indexOf(value)
来获取迭代位置,然后 map.keys.elementAt(thatIndex)
得到对应的key。
如果你真的只想要数字索引,那么你可以跳过最后一步。
它不是非常有效(您分配一个新列表并复制所有值)。另一种方法是:
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;
}
如果您想找到所有匹配项,您可以使用 .where(...)
进行搜索;如果您假设只有一个匹配项或您只想要第一个匹配项,则可以使用 firstWhere
进行搜索
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
我使用此示例在地图中进行搜索但不起作用:|:
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 is not a function
。
请帮助我在 map 对象中 search 简单方法与 indexOf
.
我找到了答案:
print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这个:
var ind = xmenObj.values.toList().indexOf('4xmen') ;
print(xmenObj.keys.toList()[ind]); // fifth
Maps不能用整数索引,所以没有indexOf
对应的操作。如果您将列表视为其中键始终是连续整数的专用映射,则相应的操作应该找到给定值的 key。
地图不是为此而构建的,因此遍历所有键和值是获得该结果的唯一方法。
我会这样做:
K keyForValue<K, V>(Map<K, V> map, V value) {
for (var entry in map.entries) {
if (entry.value == value) return key;
}
return null;
}
entries
getter 是在Dart 2中引入的,如果你没有那个,那么使用 map.values.toList().indexOf(value)
来获取迭代位置,然后 map.keys.elementAt(thatIndex)
得到对应的key。
如果你真的只想要数字索引,那么你可以跳过最后一步。 它不是非常有效(您分配一个新列表并复制所有值)。另一种方法是:
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;
}
如果您想找到所有匹配项,您可以使用 .where(...)
进行搜索;如果您假设只有一个匹配项或您只想要第一个匹配项,则可以使用 firstWhere
进行搜索
var found = xmenObj.keys.firstWhere(
(k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);