2016-05-06 88 views
0

使用jQuery,我想使用一个ID数组来查找allObjects数组中具有匹配的Id值的对象。将对象数组与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查询以某种方式,但无法弄清楚。

回答

3

你不需要这个jQuery。您可以使用Array.prototype.filter()过滤allObjectsArray.prototype.includes()检查对象Id属性是arrayOfIds

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

demo on JS Bin

+0

根据MDN的说法,如果这是一个问题,那么IE中还不支持include。 – Taplar

+0

@Taplar它有一个polyfill。 –

+0

你没有在你的答案中包括这个... – Taplar

0

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

obj["4"] 

回报:

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()中)更容易编写,但是当您频繁访问项目或阵列非常大时,也会出现性能问题。上面的解决方案依赖于对象引用的内部实现,其速度尽可能快。

0

您可以使用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(); 
+0

不要使用'+'操作符将字符串转换为数字,这会使代码无法读取。另外,为什么当'.includes()'方法使用'.indexOf()'时? –

+0

最好不要使用+,但我没有发现任何'indexOf()'的问题。 @Gothdo – Azim