如何在JavaScript中的多维对象/数组中find一个值?

我有一个多维的对象(它基本上是一个数组):

Object = { 1 : { name : bob , dinner : pizza }, 2 : { name : john , dinner : sushi }, 3 : { name : larry, dinner : hummus } } 

我想能够search关键字是“晚餐”的对象/数组,并查看它是否匹配“寿司”。

我知道jQuery有$ .inArray,但它似乎不能在multidimensional array上工作。 或者,也许我错了。 indexOf似乎也只能在一个数组级别上工作。

有没有function或现有的代码呢?

如果你有一个数组如

 var people = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ]; 

您可以使用Array对象的filter方法:

 people.filter(function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }] 

在较新的JavaScript实现中,您可以使用一个函数expression式:

 people.filter(p => p.dinner == "sushi") // => [{ "name": "john", "dinner": "sushi" }] 

您可以使用mapsearch"dinner": "sushi"

 people.map(function (person) { if (person.dinner == "sushi") { return person } else { return null } }); // => [null, { "name": "john", "dinner": "sushi" }, null] 

reduce

 people.reduce(function (sushiPeople, person) { if (person.dinner == "sushi") { return sushiPeople.concat(person); } else { return sushiPeople } }, []); // => [{ "name": "john", "dinner": "sushi" }] 

我敢肯定,你可以将其推广到任意键和值!

jQuery有一个内置方法jQuery.grep ,它的作用类似于@adamse的Answer中的ES5 filter函数,并且应该可以在旧版浏览器上正常工作。

用adamse的例子:

 var peoples = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ]; 

你可以做以下事情

 jQuery.grep(peoples, function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }] 

如果你要经常做这个search,考虑改变你的对象的格式,所以晚餐实际上是一个关键。 这就好像在数据库表中分配一个主聚簇键一样。 所以,例如:

 Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } } 

您现在可以像这样轻松访问它: Object['sushi']['name']

或者,如果对象真的是这么简单(只是在对象中的“名称”),你可以改变它:

 Obj = { 'pizza' : 'bob', 'sushi' : 'john' } 

然后像访问它: Object['sushi']

显然,并不总是可能的,或者有利于像这样重构数据对象,但重要的是,有时最好的答案是考虑数据对象是否是最好的方式。 像这样创build一个键可以更快,并创build更干净的代码。

 var getKeyByDinner = function(obj, dinner) { var returnKey = -1; $.each(obj, function(key, info) { if (info.dinner == dinner) { returnKey = key; return false; }; }); return returnKey; } 

jsFiddle 。

只要-1不是有效的密钥。

你可以用Alasql库find数组中的对象:

 var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" }, { name : "larry", dinner : "hummus" } ]; var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]); 

在jsFiddle中试试这个例子。

你可以使用一个简单的for循环:

 for (prop in Obj){ if (Obj[prop]['dinner'] === 'sushi'){ // Do stuff with found object. Eg put it into an array: arrFoo.push(Obj[prop]); } } 

下面的小提琴示例将所有包含dinner:sushi对象放在一个数组中:

https://jsfiddle.net/3asvkLn6/1/

这里已经有很多很好的答案,所以为什么不用一个像lodash或者下划线的库呢?

 obj = { 1 : { name : 'bob' , dinner : 'pizza' }, 2 : { name : 'john' , dinner : 'sushi' }, 3 : { name : 'larry', dinner : 'hummus' } } _.where(obj, {dinner: 'pizza'}) >> [{"name":"bob","dinner":"pizza"}]