如何在Javascript中找到多维对象/数组中的值?

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)

我相信你能够将它概括为任意键和值!

  • 请记住,这些解决方案是ECMAScript 5的一部分,在IE8中不受支持.http://kangax.github.com/es5-compat-table/尽管我更喜欢@adamse的答案,但亚历克斯的"老浏览器"更加友好.虽然不确定性能. (7认同)

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'].

显然并非总是可能或者有利于重构这样的数据对象,但重点是,有时最好的答案是考虑数据对象是否以最佳方式构建.创建这样的密钥可以更快,并创建更清晰的代码.


ale*_*lex 8

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)

jsFiddle.

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