基于条件数组的数组filter

我有一个数组与对象A:

A = [ { id: 12345, folder: 'folder1', name: 'Name1' }, { id: 12346, folder: 'folder1', name: 'Name2' }, { id: 12347, folder: 'folder1', name: 'Name3' }, { id: 12348, folder: 'folder1', name: 'Name4' } ] 

和一个数组B与ID:

 B = [12345, 12348] 

我想过滤/得到一个新的arrays与“文件夹”+“名称”从A基于来自B的ID

 res = ["folder1/Name1", "folder1/Name4"] 

不知道如何根据B中的ID“过滤”A?

一个非常快速的方法是使用filtermap

 A.filter(function(a) { return B.indexOf(a.id) >= 0; }) .map(function(a) { return a.folder+'/'+a.name; }); 

只是另一种方法; 使用reduce方法;

 var result = A.reduce(function(acc, current) { if(B.indexOf(current.id) !== -1) { acc.push(current.folder + '/' + current.id); } return acc; }, []); 

演示: http : //jsbin.com/biqicahaje/1/edit?js,console

与@Clint Powell方法(这也是相当不错的,更可读/可维护)的优点是,您将只通过A.length元素,而不是A.length + B.length取决于两个数组的大小可以上不能是一个优化。

 function findBy(array, search) { var res = [], arrayLen = array.length, i; for (i = 0; i < arrayLen; i++) { if (~search.indexOf(array[i].id)) { res.push(array[i].folder + '/' + array[i].name) } } return res; } 

演示: http : //jsbin.com/carem/2/edit

你可以在一个循环内创build一个循环来做到这一点。 检查第一个数组的每个元素,然后如果id的匹配将数据文件夹/名称推到一个新的数组…

这里是一个例子:

 <script type="text/javascript"> A = [ { id: 12345, folder: 'folder1', name: 'Name1' }, { id: 12346, folder: 'folder1', name: 'Name2' }, { id: 12347, folder: 'folder1', name: 'Name3' }, { id: 12348, folder: 'folder1', name: 'Name4' } ]; B = [12345, 12348]; 

***********************************************新代码* *********************************************

 var result = []; for(var i = 0; i < A.length; i++) { for(var j = 0; j < B.length; j++) { if(A[i].id == B[j]) { result.push(A[i].folder + "/" + A[i].name); } } } for(var i = 0; i < result.length; i++) { window.alert(result[i]); } </script> 

就像brso05所说的那样。

只需循环B使用一个简单for循环类似于这个片段:

 for (var i = 0; i < B.length; i++) { var id = B[i]; } 

对于B上的每次迭代,运行A并将结果放入结果数组中:

 for (var j = 0; j < A.length; j++) { if (A[j].id == id) { results.push(A[j].folder + '/' + A[j].name); } } 

结合这一点,下面的代码片段应该足以满足您的需求:

 var results = new Array(); for (var i = 0; i < B.length; i++) { var id = B[i]; for (var j = 0; j < A.length; j++) { if (A[j].id == id) { results.push(A[j].folder + '/' + A[j].name); } } } 
 var A = [ { id: 12345, folder: 'folder1', name: 'Name1' }, { id: 12346, folder: 'folder1', name: 'Name2' }, { id: 12347, folder: 'folder1', name: 'Name3' }, { id: 12348, folder: 'folder1', name: 'Name4' } ]; var B = [12345, 12348]; var result = []; for(i in B){ var this_id = B[i]; for(j in A){ if(A[j].id == this_id){ result.push(A[j].folder+"/"+A[j].name); } } } console.log(result);