如何在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" }]
您可以使用map
search"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
对象放在一个数组中:
这里已经有很多很好的答案,所以为什么不用一个像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"}]