如何在 JavaScript 中的对象数组中查找值?

IT技术 javascript jquery arrays search
2021-03-12 22:55:09

我有一个对象数组:

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

我希望能够在对象/数组中搜索键为“dinner”的位置,并查看它是否与“sushi”匹配。

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

有没有这方面的功能或现有代码?

6个回答

如果您有一个数组,例如

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

您可以使用filterArray 对象方法:

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

在较新的 JavaScript 实现中,您可以使用函数表达式:

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

您可以搜索"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" }]

我相信您可以将其推广到任意键和值!

请记住,这些解决方案是 ECMAScript 5 的一部分,在 IE8 中不受支持。kangax.github.com/es5-compat-table 尽管我更喜欢@adamse 的回答,但 alex 的回答对“旧的糟糕浏览器”更友好。虽然不确定性能。
2021-04-26 22:55:09
如EasyCo所述,IE8不支持过滤功能。但是,它很容易添加到 Array 原型中,因此可以在任何浏览器中使用,只需在脚本开头添加一个小函数即可。这在过滤器文档中进行了概述它提供了 ECMA-262 中指定的确切功能,因此实际上是相同的。
2021-04-29 22:55:09
@SalmanA - 问题或解决方案都不是指 jQuery。使用了 javascript filter(),而不是特定于 jQuery 的 $.filter() - tutorialspoint.com/javascript/array_filter.htm
2021-05-07 22:55:09
是否有原因我的返回变量不断出现引用错误?我尝试了返回“x”的前两个答案,但它一直说它未定义......
2021-05-08 22:55:09
我刚刚添加了一个使用 jQuerygrep方法的答案考虑到您的答案可能是有意义的,因为它与您正在做的事情具有相同的概念,但依赖于 jQuery 并且对糟糕的浏览器友好。
2021-05-14 22:55:09

jQuery 有一个内置方法jQuery.grep,其工作方式类似于@adamse's Answer 中的 ES5filter函数,并且应该可以在较旧的浏览器上正常工作。

使用亚当斯的例子:

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" }]
var getKeyByDinner = function(obj, dinner) {
    var returnKey = -1;

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

    return returnKey;       

}

js小提琴

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

差点赞成这个,但帖子中没有解释。
2021-05-09 22:55:09

如果您要经常进行此搜索,请考虑更改对象的格式,这样晚餐实际上是一个关键。这有点像在数据库表中分配主聚集键。因此,例如:

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

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

或者,如果对象真的这么简单(对象中只是“名称”),您可以将其更改为:

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

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

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

爱你的回答,但我发现语法问题:我的工作只是这样:obj = {“pizza”:{“name”:“bob”},“寿司”:{“name”:“john”}}警报( obj['披萨']['名字']); 但还是。谢谢!找到了我要找的东西!)
2021-04-26 22:55:09
@alexela 谢谢alexela!我用你的敏锐观察更新了我的答案!我刚刚复制了 OP 帖子中的示例并忽略了添加引号,但您是对的 - 除非至少在值周围有引号(假设它们是值而不是变量),否则它不会起作用。
2021-04-28 22:55:09

您可以使用Alasql在数组中找到对象

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

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

在 jsFiddle 中试试这个例子

我不确定这是否真的应该被否决。当需求变得比单个过滤器或减少调用更复杂时,类似 Sql 的集合查询变得更容易推理和编写。Alasql 是一个令人印象深刻的库,但不可否认,对于上面的例子来说有点矫枉过正。
2021-04-25 22:55:09
如果对象本身源自 SQL 源,那么这个答案就是天才。
2021-04-25 22:55:09