按对象值选择数组索引

时间:2014-04-10 22:54:18

标签: javascript arrays

如果我有这样的数组:

var array = [{ID:1,value:'test1'},
             {ID:3,value:'test3'},
             {ID:2,value:'test2'}]

我想按ID选择一个索引。

即,我想以某种方式选择ID:3,并获得{ID:3,value:'test3'}

最快,最轻量级的方法是什么?

5 个答案:

答案 0 :(得分:5)

使用array.filter

var results = array.filter(function(x) { return x.ID == 3 });

它返回一个数组,所以为了得到对象本身,你需要[0](如果你确定对象存在的话):

var result = array.filter(function(x) { return x.ID == 3 })[0];

或者某种辅助函数:

function getById(id) {
    var results = array.filter(function(x) { return x.ID == id });
    return (results.length > 0 ? results[0] : null);
}
var result = getById(3);

答案 1 :(得分:0)

使用lodash,你可以使用带有pluck风格输入的find:

_.find(result, {ID: 3})

答案 2 :(得分:0)

我会选择这样的事情:

function arrayObjectIndexOf(myArray, property, searchTerm) {
    for (var i = 0, len = myArray.length; i < len; i++) {
        if (myArray[i].property === searchTerm)
            return myArray[i];
    }
    return -1;
}

在你的情况下你应该这样做:

arrayObjectIndexOf(array, id, 3);

答案 3 :(得分:0)

使用过滤器不是最快的方法,因为即使要搜索的元素是第一个元素,过滤器也会一直遍历整个数组。这在较大的阵列上表现不佳。

如果您正在寻找最快的方法,只需循环直到找到元素可能是最佳选择。像下面的东西。

var findElement = function (array, inputId) {
    for (var i = array.length - 1; i >= 0; i--) {
        if (array[i].ID === inputId) {
            return array[i];
        }
    }
};

findElement(array, 3);

答案 4 :(得分:0)

var indexBy = function(array, property) {
  var results = {};
  (array||[]).forEach(function(object) {
    results[object[property]] = object;
  });
  return results
};

允许您var indexed = indexBy(array, "ID");