鍍金池/ 問答/HTML/ 考慮性能如何查找對象數(shù)組

考慮性能如何查找對象數(shù)組

問題: 已知一個數(shù)組,里面有非常多個json對象,對應(yīng)的代碼格式如下

// ...代表多個相同屬性的json對象
const RNG = [{"name": "麻辣香鍋", "age": "20"}, {"name": "小虎", "age": "20"}, ...]

希望在性能較優(yōu)的情況下,在數(shù)組中找到屬性名name小狗所對應(yīng)的age為多少

我能想到的最簡單的辦法是for循環(huán)遍歷,但是這種辦法需要遍歷整個數(shù)組,如果數(shù)組非常大,那么就非常消耗性能,請問有沒有什么更優(yōu)的辦法?

回答
編輯回答
祉小皓

從時間復(fù)雜度來看,for的復(fù)雜度是O(n)。
如果name是不重復(fù)的,可以先轉(zhuǎn)成Hash結(jié)構(gòu)存儲,如:

let nameMap = {'麻辣香鍋': 20, ...};

這樣每次用name來查找age的時間復(fù)雜度就只有O(1)了。

2018年7月12日 09:48
編輯回答
小眼睛

如果只有兩個鍵的話 最好的方法應(yīng)該就是改變數(shù)據(jù)結(jié)構(gòu)了吧。。 name為鍵 age為值 但限制的東西很多 基本不可能 但可以考慮換一種 以一個唯一的值為鍵 值為上述的對象結(jié)構(gòu) 不影響配置信息的增加 也能更快的定位 前提你有對應(yīng)的key值 當(dāng)然我覺得 在不考慮更換數(shù)據(jù)結(jié)構(gòu)的情況下 for循環(huán)就好 或許應(yīng)該還有另一種另類的方法 比如將這組數(shù)據(jù)轉(zhuǎn)化為字符串 然后正則匹配 字符串截?。ㄩL度根據(jù)數(shù)據(jù)格式定) 當(dāng)然只是想想 沒有實際操作過 不知道效果怎樣 會遇到什么坑, 自由選擇吧,

2017年12月24日 21:17
編輯回答
筱饞貓

想快自然需要空間換時間了

(()=>{
    const RNG = new Array(100000).fill(0).map((v,index)=>{return {name: index}});
    const RNG2 = new Array(100000).fill(0).reduce((res, curr, index)=>{res[""+index] = index;return res;}, {});
    const testTimes = 100000;

    console.time("RNG");
    for(var i=0;i<testTimes;i++){
        for(var j=0,l=RNG.length;j<l;j++){
            if(RNG[j].name === 50000){
                break;
            }
        }
    }
    console.timeEnd("RNG");

    console.time("RNG2");
    for(var i=0;i<testTimes;i++){
        RNG2["50000"];
    }
    console.timeEnd("RNG2");
})();
2017年9月21日 03:53
編輯回答
練命

沒有我大clearlove8888888,并不想回答這個問題。
開玩笑,我認為在不改變數(shù)組模式的情況下for循環(huán)是性能最優(yōu)的,也就是說我覺得如果你要提高性能,必須得改變數(shù)據(jù)儲存方式。

2017年3月12日 20:37