考虑性能如何查找对象数组

问题: 已知一个数组,里面有非常多个json对象,对应的代码格式如下

// ...代表多个相同属性的json对象
const RNG = [{"name": "麻辣香锅", "age": "20"}, {"name": "小虎", "age": "20"}, ...]

希望在性能较优的情况下,在数组中找到属性名name小狗所对应的age为多少

我能想到的最简单的办法是for循环遍历,但是这种办法需要遍历整个数组,如果数组非常大,那么就非常消耗性能,请问有没有什么更优的办法?

阅读 3.2k
4 个回答

没有我大clearlove8888888,并不想回答这个问题。
开玩笑,我认为在不改变数组模式的情况下for循环是性能最优的,也就是说我觉得如果你要提高性能,必须得改变数据储存方式。

想快自然需要空间换时间了

(()=>{
    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");
})();

从时间复杂度来看,for的复杂度是O(n)
如果name是不重复的,可以先转成Hash结构存储,如:

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

这样每次用name来查找age的时间复杂度就只有O(1)了。

如果只有两个键的话 最好的方法应该就是改变数据结构了吧。。 name为键 age为值 但限制的东西很多 基本不可能 但可以考虑换一种 以一个唯一的值为键 值为上述的对象结构 不影响配置信息的增加 也能更快的定位 前提你有对应的key值 当然我觉得 在不考虑更换数据结构的情况下 for循环就好 或许应该还有另一种另类的方法 比如将这组数据转化为字符串 然后正则匹配 字符串截取(长度根据数据格式定) 当然只是想想 没有实际操作过 不知道效果怎样 会遇到什么坑, 自由选择吧,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题