Que*_*ner 82 javascript arrays search jquery
我有一个多维对象(它基本上是一个数组):
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在对象/数组中搜索关键字"吃饭"的位置,并查看它是否与"寿司"匹配.
我知道jQuery有$ .inArray,但它似乎不适用于多维数组.或者也许我错了.indexOf似乎也只能在一个数组级别上工作.
这个没有功能或现有代码吗?
ada*_*mse 188
如果你有一个像这样的数组
var people = [
{ "name": "bob", "dinner": "pizza" },
{ "name": "john", "dinner": "sushi" },
{ "name": "larry", "dinner": "hummus" }
];
Run Code Online (Sandbox Code Playgroud)
您可以使用filterArray对象的方法:
people.filter(function (person) { return person.dinner == "sushi" });
// => [{ "name": "john", "dinner": "sushi" }]
Run Code Online (Sandbox Code Playgroud)
在较新的JavaScript实现中,您可以使用函数表达式:
people.filter(p => p.dinner == "sushi")
// => [{ "name": "john", "dinner": "sushi" }]
Run Code Online (Sandbox Code Playgroud)
您可以搜索"dinner": "sushi"使用过的人map
people.map(function (person) {
if (person.dinner == "sushi") {
return person
} else {
return null
}
}); // => [null, { "name": "john", "dinner": "sushi" }, null]
Run Code Online (Sandbox Code Playgroud)
或者a reduce
people.reduce(function (sushiPeople, person) {
if (person.dinner == "sushi") {
return sushiPeople.concat(person);
} else {
return sushiPeople
}
}, []); // => [{ "name": "john", "dinner": "sushi" }]
Run Code Online (Sandbox Code Playgroud)
我相信你能够将它概括为任意键和值!
Zac*_*bey 17
jQuery有一个内置的方法jQuery.grep,filter与@adamse的答案中的ES5 函数类似,应该可以在旧浏览器上正常工作.
使用adamse的例子:
var peoples = [
{ "name": "bob", "dinner": "pizza" },
{ "name": "john", "dinner": "sushi" },
{ "name": "larry", "dinner": "hummus" }
];
Run Code Online (Sandbox Code Playgroud)
你可以做到以下几点
jQuery.grep(peoples, function (person) { return person.dinner == "sushi" });
// => [{ "name": "john", "dinner": "sushi" }]
Run Code Online (Sandbox Code Playgroud)
dal*_*lin 10
如果您要经常进行此搜索,请考虑更改对象的格式,以便晚餐实际上是关键.这有点像在数据库表中分配主群集密钥.所以,例如:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }
Run Code Online (Sandbox Code Playgroud)
您现在可以像这样轻松访问它: Object['sushi']['name']
或者,如果对象真的很简单(只是对象中的"名称"),您可以将其更改为:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }
Run Code Online (Sandbox Code Playgroud)
然后访问它想:Object['sushi'].
显然并非总是可能或者有利于重构这样的数据对象,但重点是,有时最好的答案是考虑数据对象是否以最佳方式构建.创建这样的密钥可以更快,并创建更清晰的代码.
var getKeyByDinner = function(obj, dinner) {
var returnKey = -1;
$.each(obj, function(key, info) {
if (info.dinner == dinner) {
returnKey = key;
return false;
};
});
return returnKey;
}
Run Code Online (Sandbox Code Playgroud)
只要-1不是有效的密钥.