在数组中的特定位置搜索值

时间:2015-04-24 20:05:00

标签: javascript jquery arrays

我有以下数组:

[
    {
        id: "12345",
        name: "Bryan"
    },
    {
        id: "55555",
        name: "Justin"
    }
]

我希望能够在此数组中搜索 id 55555 的任何项目,然后才能在我正在搜索的数组中编辑该对象。< / p>

我能想到的唯一方法是:

function searchme(arr, where, equals)
{
    $.each(arr, function(key, value) {
        if(value.where == equals) return value;
        else return false;
    });
}

console.log(searchme(arr, "id", "55555"));

有没有人有更好的方法?

4 个答案:

答案 0 :(得分:1)

假设您的对象数组名为things。然后使用filter方法,我们可以迭代列表并检查每个元素的特定条件。例如:

var thing = things.filter(function (item) {
    return "55555" === item.id
})[0]
// {id: "55555", name: "Justin"}

JSFiddle

说明:

filter方法具有比较功能。数组中的每个项都传递给函数。数组中符合函数条件的所有项(在本例中为"55555" === item.id)都以数组形式返回到赋值目标。

由于filter返回一个匹配数组,我在末尾拉出零索引[0]元素,因此只有对象返回变量thing

如果要维护对象索引,可以先使用map方法将其添加到对象中,然后filter向下添加到所需对象。

var thing = things.
    map(function (item, idx) {
        item.idx = idx
        return item
    }).
    filter(function (item) {
        return "55555" === item.id
    })[0]
// {id: "55555", name: "Justin", idx: 1}

JSFiddle with index

答案 1 :(得分:0)

如果不知何故你有字符串,你可以用正则表达式搜索:

(?=(?:{[^{]*id\:\s\"55555\"[^}]*})){[^}]*}

在regexr.com上测试:

enter image description here

答案 2 :(得分:0)

您的return设置不正确。

通过$.each return只返回$.each而不是外部函数searchme()的回调。它在一个范围关闭。因此,您永远不会从searchme返回任何内容。

此外,return false中的$.each会打破循环

另一点是,当对象键是变量

时,您需要使用[]对象表示法

尝试:

function searchme(arr, where, equals)
{
    var result = false;
    $.each(arr, function(key, value) {
        if(value[where] == equals) { // change to [] notation
           result = value;
           return false; // found a match so break the each loop
        }
    });
    return result; // return from searchme()
}

有更短的方法可以获得相同的结果,但同样重要的是要理解为什么我尝试的代码没有工作,这就是我留在$.each的原因

答案 3 :(得分:0)

BloodyKnuckles的回答很简单,适用于大多数情况。

如果您正在搜索不会发生太大变化的大型数组,并且反复这样做,那么线性搜索将不是最快的。作为替代方案,您可以构建一个索引,让您更快地达到您想要的目标:

var ArrayIndex = function(arr, key) {
    var self = this;

    var _index = {};

    for (var i=0; i<arr.length; i++) {
        var k = key(arr[i]);        

        _index.hasOwnProperty(k) ? _index[k].push(i) : _index[k] = [ i ];                    
    }        

    self.contains = function(key) {
        return _index.hasOwnProperty(key);
    };

    self.firstIndex = function(key) {
        console.log(_index[key]);

        return _index.hasOwnProperty(key) ? _index[key][0] : null;
    }

    self.allIndices = function(key) {
       return _index.hasOwnProperty(key) ? _index[key] : null;
    }    

    self.firstItem = function(key) {
       return _index.hasOwnProperty(key) ? arr[_index[key]] : null;
    }
}

var idx = new ArrayIndex(a, function(val) {
    return val.id;
});

var result = idx.findFirst(55555);

对于大型阵列(100,000多个项目),可以提升性能。缺点是每次更新阵列时都必须重新创建索引。

JSFiddle