簡體   English   中英

使用JavaScript和/或jQuery搜索關聯的多維數組(對象)的有效方法,用於基於值的鍵

[英]efficient way to search an associative, multi-dimensional array (object) using JavaScript and/or jQuery for key based on value

我有一個看起來像這樣的對象:

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(),必須有更好的方法......或者可能不是 - 我此刻難倒。

任何見解都將非常感謝!!

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

嵌套循環不是必需的,你只需要遍歷每個數組元素..在我看來非常有效。

您可能會驚訝於for循環在現代瀏覽器中對陣列執行的速度有多快。

但是,您也可以為此維護不同的數據結構。
只需使用一些循環來構建一個像這樣結構化的新對象

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

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

從那時起,查找速度非常快。

我假設值是標量,否則這不會起作用,因為只有標量可以用作屬性名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM