2011-03-03 118 views
68

我有一个多维对象(这基本上是一个数组):如何在Javascript中的多维对象/数组中找到值?

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

我希望能够寻找其中的关键是“饭局”的对象/数组,看它是否符合“寿司”。

我知道jQuery有$ .inArray,但它似乎不适用于多维数组。或者,也许我错了。 indexOf似乎也只适用于一个数组级别。

这是否没有功能或现有的代码?

+0

这已被问过。您必须编写自己的函数或使用其他库。 – 2011-03-03 13:47:51

+1

请注意'Object'是Javascript中保留的,''Object''是对象对象,即所有对象的母亲。 – adamse 2011-03-03 14:15:37

+0

问题和接受的答案与多维数组无关,但更多的是通过其项目属性值进行1维数组过滤。 =>他们没有解决我的问题“在多维数组中找到一个值”。 – 2017-02-09 17:44:12

回答

161

如果有一个数组如

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实现可以使用一个函数表达式:

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

您可以使用map

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" }] 

我敢肯定你能概括这个任意键和值搜索谁拥有"dinner": "sushi"人!

+5

请记住,这些解决方案是ECMAScript 5的一部分,在IE8中不受支持。 http://kangax.github.com/es5-compat-table/ 尽管我更喜欢@adamse的回答,但alex的更加“老旧的浏览器”友好。不确定性能。 – EasyCo 2012-09-25 05:46:25

+0

@SalmanA - 问题或解决方案是指jQuery。使用javascript filter(),而不是特定于jQuery的$ .filter() - http://www.tutorialspoint.com/javascript/array_filter.htm – Tapirboy 2013-01-14 14:14:26

+0

正如EasyCo提到的那样,IE8不支持筛选器功能。但是,它很容易添加到Array原型中,因此可以在脚本开头的任何带有小功能的浏览器中使用。这在[过滤器文档](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter)中进行了概述。它给出了在ECMA-262中指定的确切函数,所以它几乎是一样的。 – dallin 2013-03-08 17:20:03

8
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不是有效的密钥。

9

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

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

现在,您可以轻松地访问它是这样的:Object['sushi']['name']

或者如果对象真的是这样简单(只需“名”的对象),你可以只将其更改为:

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

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

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

+0

爱你回答,但我发现语法问题: 矿工只喜欢这个: obj = {“pizza”:{“name”:“bob”}, “sushi”:{“name”:“john”} } alert(obj ['pizza'] ['name'] ); 但仍然,谢谢!发现我正在寻找!) – aleXela 2013-04-09 13:40:27

+0

@alexela谢谢alexela!我更新了我的答案,您的精明观察!我刚刚在OP的帖子中复制了示例,并忽略了添加引号,但是您'对 - 如果没有至少在值附近有引号(假设它们是值而不是变量),它将不起作用。 – dallin 2013-04-10 20:18:30

17

jQuery有一个内置方法jQuery.grep,其工作原理与@adamse's 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" }] 
1

您可以Alasql图书馆查找数组对象:

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

var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]); 

试试这个例子in jsFiddle

+3

我不确定这真的值得下载投票。当需求变得比单个过滤器更复杂或减少调用时,对集合的查询等Sql更容易推理和编写。 Alasql是一个非常令人印象深刻的库,但对于上面的例子来说,确实有点矫枉过正。 – TomDotTom 2015-07-30 01:13:38

+1

如果对象本身起源于SQL源,那么这个答案就是纯粹的天才。 – edwardsmarkf 2017-01-16 18:59:24

1

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

for (prop in Obj){ 
    if (Obj[prop]['dinner'] === 'sushi'){ 

     // Do stuff with found object. E.g. put it into an array: 
     arrFoo.push(Obj[prop]); 
    } 
} 

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

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

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"}] 
相关问题