使用JavaScript和/或jQuery以键为基础查找关联多维数组(对象)的高效方法

3

我有一个看起来像这样的对象:

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()函数,一定有更好的方法...或许没有-我只是目前被困住了。

任何见解都将不胜感激!!


其次,这些是对象,而不是关联数组。 - Parth Thakkar
myKey 的值不应该是 autos 吗? - jbabey
抱歉,我的错。是的,myKey的值应该是“autos”。请忽略“otherkey”。 - user1424071
2个回答

3

除了像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;
}

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

哇,我肯定想太多了。这个解决方案完美地解决了问题。谢谢!! - user1424071

2
你可能会惊讶于现代浏览器中for循环在数组上的执行速度有多快。
但是,你也可以为此维护不同的数据结构。只需使用一些循环来构建一个新对象,其结构如下。
var map = {
    prop1: {a: ["planes"], x: ["trains"], red: ["autos"]}
  , prop2: {...}
};

function getKey(prop, val) {
   return map[prop][val] || [];
}

那么从那时起,查找将非常快速。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接