簡體   English   中英

基於條件數組的數組過濾器

[英]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?

一種快速的方法是使用filtermap

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM