搜索对象的更好方法

时间:2017-01-17 01:34:35

标签: javascript arrays json object array-algorithms

我经常会发现自己必须从被任意索引索引的对象或对象数组中访问特定对象,但我需要的对象是一个键与特定值匹配的对象。

例如:

var cars = [
    { id:23, make:'honda', color: 'green' },
    { id:36, make:'acura', color:'silver' },
    { id:18, make:'ford', color:'blue' },
    { id:62, make:'ford', color:'green' }, 
];

假设我需要其中一个条目,我知道这个条目是唯一的;例如,id = 18的那个。

现在,我是通过以下方式做到这一点:

function select(key,val,arr){

    for(var i in arr){
        if(arr[i][key]==val) return(arr[i]);
    }
    return(null); // object not present in arr
}


var id = 18;
var car = select('id', id, cars);

// car = { id:18, make:'ford', color:'blue' }

但这看起来很麻烦,并且随着性能的不同而缩小。如果大数据集的值朝向数组的开头,或者最坏的情况下,将返回与条目一样多的迭代,则可以非常快速地返回大数据集中的值。 如果该值根本不存在,这似乎也非常浪费,因为您只是迭代所有对象只是为了得到一个null结果。

当搜索条件与主题键的参数不同时,是否有更优雅的方法搜索数组或对象的值?

3 个答案:

答案 0 :(得分:1)

创建一个对象,其键是您希望能够搜索的属性:

var cars_by_id = {};
cars.forEach(c => cars_by_id[c.id] = c);

现在您可以使用cars_by_id[id]来获得所需的汽车。

每当您按下cars时,您还需要添加到cars_by_id。您可能希望定义一个自动执行此操作的类。

答案 1 :(得分:1)

构造一个对象,其中每个键都是car对象的id,值是car对象本身:

var cars = {
    23: { id:23, make:'honda', color: 'green' },
    36: { id:36, make:'acura', color:'silver' },
    18: { id:18, make:'ford', color:'blue' },
    62: { id:62, make:'ford', color:'green' }, 
};

这样可以更快地访问:

console.log(cars[18].make);

答案 2 :(得分:1)

您可以使用Array.prototype.map()创建一个阴影数组,它可以帮助您更快地搜索,或者您可以创建一个index对象,如下所示,它将直接返回您需要的索引。

var cars = [
    { id:23, make:'honda', color: 'green' },
    { id:36, make:'acura', color:'silver' },
    { id:18, make:'ford', color:'blue' },
    { id:62, make:'ford', color:'green' }, 
];
let cars_s = cars.map(function(x) {
    return x.id;
});
let i = cars_s.indexOf(18);
console.log(i); // 2
console.log(cars[i]); // { id:18, make:'ford', color:'blue' }

let index = {};
for (let i = 0; i < cars_s.length; i++) {
    index[cars_s[i]] = i;
}
console.log(index[18]); // 2