我有以下数组:
[
{
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"));
有没有人有更好的方法?
答案 0 :(得分:1)
假设您的对象数组名为things
。然后使用filter
方法,我们可以迭代列表并检查每个元素的特定条件。例如:
var thing = things.filter(function (item) {
return "55555" === item.id
})[0]
// {id: "55555", name: "Justin"}
说明:
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}
答案 1 :(得分:0)
如果不知何故你有字符串,你可以用正则表达式搜索:
(?=(?:{[^{]*id\:\s\"55555\"[^}]*})){[^}]*}
在regexr.com上测试:
答案 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多个项目),可以提升性能。缺点是每次更新阵列时都必须重新创建索引。