使用JavaScript和/或jQuery搜索基于值的键的关联多维数组(对象)的有效方法

使用JavaScript和/或jQuery搜索基于值的键的关联多维数组(对象)的有效方法,javascript,jquery,search,object,Javascript,Jquery,Search,Object,我有一个类似于此的对象: var arr = {}; arr.planes = { prop1 : 'a', prop2 : 'b', prop3 : 'c' }; arr.trains = { prop1 : 'x', prop2 : 'y', prop3 : 'z' }; arr.autos = { prop1 : 'red', prop2 : 'orange', prop3 : 'blue' }; 我正在尝试编写一个函数(快速高效),该函数将基于嵌套在最外层数组中的键/值对返回最外层数

我有一个类似于此的对象:

var arr = {};

arr.planes = { prop1 : 'a', prop2 : 'b', prop3 : 'c' };
arr.trains = { prop1 : 'x', prop2 : 'y', prop3 : 'z' };
arr.autos = { prop1 : 'red', prop2 : 'orange', prop3 : 'blue' };
我正在尝试编写一个函数(快速高效),该函数将基于嵌套在最外层数组中的键/值对返回最外层数组的键(如果有多个键,则返回键数组)。比如:

function getKey(obj, prop, val) {
   // do some stuff...
   return key;
}

var myKey = getKey(arr, 'prop2', 'orange');
myKey的值应为“autos”

我很确定这可以通过几个嵌套的for循环来完成,但是这些数组相当大,我认为,特别是使用jquery的grep(),必须有更好的方法。。。或者也许不是——我只是一时糊涂


如有任何见解,将不胜感激

在现代浏览器中,for循环在数组上的执行速度可能会让您感到惊讶

但是,您也可以为此维护不同的数据结构。
只需使用一些循环来构建一个新的对象,其结构如下

var map = {
    prop1: {a: ["planes"], x: ["trains"], red: ["autos"]}
  , prop2: {...}
};

function getKey(prop, val) {
   return map[prop][val] || [];
}
从那时起,查找速度非常快


我假设这些值是标量值,否则这将不起作用,因为只有标量可以用作属性名。

除了像chris建议的那样更改数据结构之外,这几乎是您唯一的选择:

function getKey(obj, prop, val) {
    var keys = [];

    for (var key in obj) {
        if (obj[key].hasOwnProperty(prop) && obj[key][prop] === val) {
            keys.push(key);                
        }            
    }

    return keys;
}

嵌套循环不是必需的,您只需遍历每个数组元素一次。。在我看来相当有效。

其次,这些是对象,而不是关联数组。
myKey
的值不应该是
autos
?见鬼去吧。是的,myKey的值应该是“autos”。请忽略“otherkey”。哇,我肯定是想得太多了。这个解决方案非常有效。谢谢