【问题标题】:efficient way to search an associative, multi-dimensional array (object) using JavaScript and/or jQuery for key based on value使用 JavaScript 和/或 jQuery 根据值搜索关联的多维数组(对象)的有效方法
【发布时间】:2012-06-03 20:55:03
【问题描述】:

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

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' };

我正在尝试编写一个函数(快速且高效),它将基于嵌套在其中的键/值对返回最外层数组的键(或键数组,如果有超过 1 个)。比如:

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

var myKey = getKey(arr, 'prop2', 'orange');

myKey 的值应该是“autos”。

我很确定这可以通过几个嵌套的 for 循环来完成,但这些数组相当大,我认为,尤其是使用 jquery 的 grep(),必须有更好的方法......或者也许不是——我现在只是被难住了。

任何见解将不胜感激!

【问题讨论】:

  • 其次,这些是对象,而不是关联数组。
  • myKey 的值不应该是autos 吗?
  • 拍我的坏。是的,myKey 的值应该是“autos”。请忽略“其他键”。

标签: javascript jquery search object


【解决方案1】:

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

不需要嵌套循环,您只需遍历每个数组元素一次。在我看来非常有效。

【讨论】:

  • 哇,我确实想多了。该解决方案完美运行。谢谢!!
【解决方案2】:

您可能会惊讶于 for 循环在现代浏览器中对数组执行的速度有多快。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2014-08-12
    • 2014-04-11
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多