[英]Filter an array of objects based on filter criteria in another array of objects: JavaScript
[英]Array filter based on criteria array
我有一個包含對象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'
}
]
和ID為B的數組B:
B = [12345, 12348]
我想根據來自B的ID來過濾/獲取來自A的“文件夾” +“名稱”的新數組
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;
});
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
只是另一種方法; 使用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,控制台
相對於@Clint Powell方法(它也非常好,並且更具可讀性/可維護性)的優點是,您將僅循環通過A.length
元素,而不是A.length + B.length
這取決於兩個數組的大小不能是優化。
您可以在一個循環中創建一個循環來執行此操作。 檢查第一個數組的每個元素,然后如果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所說的那樣。
只需使用類似於以下代碼段的簡單for
循環遍歷B
:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.