使用数组反向查找对象

如果我有这样的对象,请说

resourceMap = { "a": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "b": [11, 12], "c": [21, 23], "d": [54, 55, 56, 57, 510] }; 

找出resourceId = 21是否为"c"的最佳方法是什么?

我们不知道密钥的名称或密钥数量。 它只匹配一次:意思是21只属于一个键"c"

我正在考虑循环遍历所有键并执行indexOf() ,但我觉得它不够“优雅”。

我可以使用Underscore但是尽量避免使用Angular或jQuery或者只是使用vanilla Javascript。

在JavaScript中拥有对象的数字属性名称是完全可以接受的。 我们可以利用这个来构建第二个反向映射所有内容的对象。 这将使查找成本低廉。

 var reverseMap = {}; for(var propName in resourceMap) { var numsArr = resourceMap[propName]; numsArr.forEach(function(num){ reverseMap[num]=propName; }); } console.log(reverseMap[54]); //'d' 

http://jsfiddle.net/y11sbgbv/

构建reverseMap也可以在“function上”更多地完成(例如,不使用副作用),如下所示:

 var reverseMap2 = Object.keys(resourceMap).reduce((acc, propName) => resourceMap[propName].reduce((a, num) => { a[num] = propName; return a; }, acc), {}); 

预处理到不同的查找表

 var revMap = []; // or var revMap = {}; Object.keys(resourceMap).forEach(function(key) { resourceMap[key].forEach( function (ind) { revMap[ind] = key; }); }); console.log(revMap[21]) 

或按需查看:

 resourceMap = { "a": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "b": [11, 12], "c": [21, 23], "d": [54, 55, 56, 57, 510] }; function findMapKey (map, ind) { var match = null; Object.keys(map).some(function(key) { var test = map[key].indexOf(ind)!==-1; if (test) { match = key; } return test; }); return match; } console.log(findMapKey(resourceMap, 21)); 

看起来值已排序,因此您可以先查看每个数组的最新值是否大于您要搜索的值,一旦找到它,就会查找值本身。

 for(var propName in resourceMap) { var array = resourceMap[propName]; var lastNum = array[array.length-1]; if(lastNum == 21 || (lastNum > 21 && array.indexOf(21) > -1)) { console.log(propName) break; } } 

除非您正在处理大量数据,否则您的想法很好:

  var resourceMap = { "a": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "b": [11, 12], "c": [21, 23], "d": [54, 55, 56, 57, 510] }; /** * @return resource's group, or false if no matching group is found */ var getResourceGroup = function(res) { for (var i in resourceMap) { if (resourceMap[i].indexOf(res) > -1) { return i; } } return false; } console.log(getResourceGroup(21)); 

尝试

 resourceMap = { "a": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "b": [11, 12], "c": [21, 23], "d": [54, 55, 56, 57, 510] }; var getKey = function(val, _key) { $.each(resourceMap, function(k, v) { if ($.inArray(val, v) != -1) { _key = k } }) return _key }; getKey(21) 

jsfiddle http://jsfiddle.net/guest271314/gbnzmq51/