Javascript 更高效的数组搜索

Javascript 更高效的数组搜索,javascript,arrays,Javascript,Arrays,我希望根据对象的唯一属性(即,键)从对象数组中提取特定对象 在下面,我正在“arr”中搜索一个元素,其中键是8 var myElement = arr.filter(function(element) { return element.key === 8; }); 这是可行的,但每次运行时,它都会遍历数组中的所有元素,即使在找到正确的元素之后也是如此。例如,如果它在索引4处找到myElement,但数组中有100个元素,则代码段的运行量比需要的多25倍 有没有更有效的方法,或者在filte

我希望根据对象的唯一属性(即,键)从对象数组中提取特定对象

在下面,我正在“arr”中搜索一个元素,其中键是8

var myElement = arr.filter(function(element) {
  return element.key === 8;
});
这是可行的,但每次运行时,它都会遍历数组中的所有元素,即使在找到正确的元素之后也是如此。例如,如果它在索引4处找到myElement,但数组中有100个元素,则代码段的运行量比需要的多25倍

有没有更有效的方法,或者在filter()找到myElement时终止它


我觉得我错过了一些明显的东西

for(var i=0;i
for(var i=0;i您实际上需要一个
find
函数,该函数在找到第一个匹配项时返回。如果您使用ECMAScript 6规范,您可以使用该函数,或者您可以实现一个简单的
find
函数,如:

for (var i=0; i<arr.length; i++) {
    if (arr[i].key === 8) {
        console.log('FOUND ITEM AT KEY '+8);
        break;
    }
}
function find8(arr) {
    // type checks skipped for brevity
    var i = 0,
        j = arr.length;

    for (; i < j; i++) {
        if (arr[i].key === 8) {
            return arr[i];
        }
    }

    throw new Error('Not found');
}

实际上,您需要一个
find
函数,该函数在找到第一个匹配项时返回。如果您使用的是ECMAScript 6规范,则可以使用该函数,或者可以实现一个简单的
find
函数,如:

function find8(arr) {
    // type checks skipped for brevity
    var i = 0,
        j = arr.length;

    for (; i < j; i++) {
        if (arr[i].key === 8) {
            return arr[i];
        }
    }

    throw new Error('Not found');
}

听上去,你最好做这样的事情:

function findByKey(items, key) {
    for (var index = 0; index < items.length; index++) {
        var item = items[index];
        if (item.key === key) {
            return item;
        }
    }
    return null;
}
函数findByKey(项、键){
对于(var索引=0;索引
请注意,如果您的列表已排序,则您可以通过执行二进制搜索来改进这一点。但就个人而言,我建议使用哈希(假设同一个键不会使用两次)。类似于:

var array = [/* your data here... */];
var map = {};

//do this once; or once each time your array changes
for (var index = 0; index < array.length; index++) {
    var item = array[index];
    map[item.key] = item;
}

//now find things by doing this
var itemWithKey8 = map[8];
var数组=[/*您的数据在此…*/];
var-map={};
//执行一次;或者每次阵列更改时执行一次
对于(var index=0;index
听上去你最好还是做这样的事情:

function findByKey(items, key) {
    for (var index = 0; index < items.length; index++) {
        var item = items[index];
        if (item.key === key) {
            return item;
        }
    }
    return null;
}
函数findByKey(项、键){
对于(var索引=0;索引
请注意,如果您的列表已排序,则您可以通过执行二进制搜索来改进这一点。但就个人而言,我建议使用哈希(假设同一个键不会使用两次)。类似于:

var array = [/* your data here... */];
var map = {};

//do this once; or once each time your array changes
for (var index = 0; index < array.length; index++) {
    var item = array[index];
    map[item.key] = item;
}

//now find things by doing this
var itemWithKey8 = map[8];
var数组=[/*您的数据在此…*/];
var-map={};
//执行一次;或者每次阵列更改时执行一次
对于(var index=0;index
我会用一个简单的
for
循环来处理这个问题(使用了一个通用重用函数):


我将使用一个简单的
for
循环(使用一个函数进行通用重用)来处理这个问题:


为什么要重新发明轮子?这里有很多类似的答案,所以我将分享一种不同的方法——到目前为止我最喜欢的方法。有一个名为(独立版本和jQuery插件版本)的优秀库,它使搜索、筛选、排序等变得轻而易举

var myElement = Enumerable.From(arr).FirstOrDefault(null,         function(element) {
      return element.key === 8;
});

在上面的示例中,返回与条件匹配的第一个元素。如果未找到任何内容,则返回null(第一个参数是要返回的默认值).

为什么要重新发明轮子?这里有很多类似的答案,所以我将分享一种不同的方法——到目前为止我最喜欢的方法。有一个名为(单机版和jQuery插件版)的优秀库,它使搜索、筛选、排序等变得轻而易举

var myElement = Enumerable.From(arr).FirstOrDefault(null,         function(element) {
      return element.key === 8;
});

在上面的示例中,将返回与条件匹配的第一个元素。如果未找到任何内容,则返回null(第一个参数是要返回的默认值)。

这是错误的。筛选器将返回一个新数组(因此,除非您知道有一个对象,否则可以返回一个大小为2的数组,其中包含两个具有
key==8
)的对象。您可以使用一个简单的
进行
循环。键是唯一的,因此只有一个对象具有
元素。键===8
请参见我的答案,特别是第二部分。这是错误的。筛选器返回一个新数组(因此,除非您知道您有一个对象,否则可以返回一个大小为2的数组,其中两个对象具有
键===8
)。您可以使用一个简单的
for
循环。键是唯一的,因此只有一个对象具有
元素。键===8
请参见我的答案,特别是第二部分。