在文档内部数组中通过键访问文档的有效方法?

时间:2016-03-01 08:00:10

标签: javascript arrays performance

在JavaScript中,我需要一种有效的方法来访问具有以下形式的数组中的文档:

[
    { 
      a : '1',
      b : '2',
      c : '3'
    },
    { 
      a : '4',
      b : '5',
      c : '6'
    },
    {...},
    {...}
]

因此,所有文档都具有相同的密钥。如果我有a的值(例如a = 4),有没有办法从数组中检索a = 4的文档而不循环遍历数组中的所有元素并执行检查?

3 个答案:

答案 0 :(得分:4)

只显示您显示的数据结构,如果没有一些循环遍历数组的代码,则无法检索密钥a === '4'的对象。数组没有任何权力可以在其中的嵌套对象中查找内容而无需循环。

可以构建该数组的单独索引,或者将数据重组为不同类型的数据结构,然后允许您在不循环的情况下检索所需的项目,但不能在此处构建数据。

例如,您可以循环遍历数组并构建数组中存在的a的所有值的索引,以便通过该索引的一次访问,您可以知道哪些数组元素包含所需的值a。但是,您必须首先构建该类型的索引,然后才能使用它。如果这是一次性访问,那么任何时候都不会为您节省费用,但如果您要反复查找a的值,则可以节省大量时间。构建索引一次,然后多次使用它以提高查找特定值的效率。

如果数组很大,为了更有效地查找数据,这里有一个方法,用于索引数据一次,然后在此之后多次使用该索引。这假设数据是一个字符串或具有非模糊的字符串转换(您的示例适合):



var data = [
    { a : '1', b : '2', c : '3', d : '1'},
    { a : '4', b : '5', c : '6', d : '1'},
    { e : '3', a : '1', c : '5'},
];

function ArrayIndex(data) {
    var index = {};
    data.forEach(function(obj, i) {
        Object.keys(obj).forEach(function(key) {
            var combinedKeyVal = "_" + key + "_" + obj[key];
            var slot = index[combinedKeyVal];
            if (!slot) {
                slot = index[combinedKeyVal] = [];
            }
            // add this index to the slot array
            slot.push(i)
        });
    });
    
    this.find = function(key, val) {
        var combinedKeyVal = "_" + key + "_" + val;
        return index[combinedKeyVal] || [];
    }
}

var index = new ArrayIndex(data);
var found = index.find('a', '4');
log(found);
found = index.find('d', '1');
log(found);
found = index.find('c', '5');
log(found);
found = index.find('d', '2');
log(found);

// display output in snippet
function log(x) {
    var div = document.createElement("div");
    div.innerHTML = JSON.stringify(x);
    document.body.appendChild(div);
}




答案 1 :(得分:0)

您可以使用Array.prototype.filter

var document = arr.filter(function(element) {
    return element.a === '4';
}, arr)[0];

console.log(document);

答案 2 :(得分:0)

也许您应该阅读binary search algorithm。互联网上有许多JS实现。