基于条件数组的数组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?
一个非常快速的方法是使用filter
和map
。
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);