Javascript 将对象数组与ID数组进行比较

Javascript 将对象数组与ID数组进行比较,javascript,jquery,arrays,Javascript,Jquery,Arrays,使用jQuery,我想使用一个Id数组来查找allObjects数组中具有匹配Id值的对象 var arrayOfIds = [1, 4, 5]; var allObjects = [{"Id":"1", "name":"aa"},{"Id":"2", "name":"bb"} ,{"Id":"3", "name":"cc"} ,{"Id":"4", "name":"dd"}, {"Id":"5", "name":"ee"}, {"Id":"6", "name":"ff"}, {"Id":"7

使用jQuery,我想使用一个Id数组来查找
allObjects
数组中具有匹配
Id
值的对象

var arrayOfIds = [1, 4, 5];

var allObjects = [{"Id":"1", "name":"aa"},{"Id":"2", "name":"bb"} ,{"Id":"3", "name":"cc"} ,{"Id":"4", "name":"dd"}, {"Id":"5", "name":"ee"}, {"Id":"6", "name":"ff"}, {"Id":"7", "name":"gg"}, {"Id":"8", "name":"hh"}, {"Id":"9", "name":"ii"}];
结果将等于:

[{"Id":"1", "name":"aa"}, {"Id":"4", "name":"dd"}, {"Id":"5", "name":"ee"}]
到目前为止,我只能使用以下方法提取单个对象:

var result = $.grep(arrayOfIds, function(e) { return e.Id == 3; });

我觉得似乎可以通过某种方式修改上面的$.grep查询来获得答案,但无法找到答案。

您不需要jQuery。您可以使用筛选
allObjects
,并检查对象
Id
属性是否在
arrayOfIds
中:

allObjects.filter(x=> arrayOfIds.includes(Number(x.Id)))

请参阅。

此操作不需要jQuery。您可以使用筛选
allObjects
,并检查对象
Id
属性是否在
arrayOfIds
中:

allObjects.filter(x=> arrayOfIds.includes(Number(x.Id)))

请参阅。

最好的方法是将数组转换为对象本身:

function atoo(a)
{
  var i, obj;

  obj = {};

  for (i = 0; i < a.length; i++)
  {
    obj[a[i].Id] = a[i];
  }

  return obj;
}
返回也存储在数组中
a[3]
下的正确对象

不涉及jQuery,它应该被视为一个特性,因为它是所有这些问题的通用解决方案


使用筛选器(如在
Array.prototype.filter()
中)更容易编写,但当您经常访问项目或数组非常大时,也会导致性能问题。上述解决方案依赖于对象引用的内部实现,其速度与您希望的一样快。

最好是将数组转换为对象本身:

function atoo(a)
{
  var i, obj;

  obj = {};

  for (i = 0; i < a.length; i++)
  {
    obj[a[i].Id] = a[i];
  }

  return obj;
}
返回也存储在数组中
a[3]
下的正确对象

不涉及jQuery,它应该被视为一个特性,因为它是所有这些问题的通用解决方案

使用筛选器(如在
Array.prototype.filter()
中)更容易编写,但当您经常访问项目或数组非常大时,也会导致性能问题。上述解决方案依赖于对象引用的内部实现,其速度与您希望的一样快。

您可以使用如下方法

var arrayOfIds = [1, 4, 5];
var allObjects = [{ "Id": "1", "name": "aa" }, { "Id": "2", "name": "bb" }, { "Id": "3", "name": "cc" }, { "Id": "4", "name": "dd" }, { "Id": "5", "name": "ee" }, { "Id": "6", "name": "ff" }, { "Id": "7", "name": "gg" }, { "Id": "8", "name": "hh" }, { "Id": "9", "name": "ii" }];
var result = $(allObjects).filter(function() { return arrayOfIds.indexOf(+this.Id) > -1 }).get();
您可以像下面这样使用
filter()
方法

var arrayOfIds = [1, 4, 5];
var allObjects = [{ "Id": "1", "name": "aa" }, { "Id": "2", "name": "bb" }, { "Id": "3", "name": "cc" }, { "Id": "4", "name": "dd" }, { "Id": "5", "name": "ee" }, { "Id": "6", "name": "ff" }, { "Id": "7", "name": "gg" }, { "Id": "8", "name": "hh" }, { "Id": "9", "name": "ii" }];
var result = $(allObjects).filter(function() { return arrayOfIds.indexOf(+this.Id) > -1 }).get();

不要使用
+
运算符将字符串转换为数字,这会使代码无法读取。还有,当存在
.includes()
方法时,为什么要使用
.indexOf()
呢?最好不要使用+,但我没有发现
indexOf()有任何问题@GothDono不要使用
+
运算符将字符串转换为数字,这会使代码无法读取。还有,当存在
.includes()
方法时,为什么要使用
.indexOf()
呢?最好不要使用+,但我没有发现
indexOf()有任何问题@根据MDN,IE中还不支持includes,如果这是一个问题。@Taplar有一个polyfill用于它。根据MDN,IE中还不支持includes,如果这是一个问题。@Taplar有一个polyfill用于它。