2011-03-03 162 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"}] 
相關問題