【问题标题】:Array filter based on criteria array基于条件数组的数组过滤器
【发布时间】:2014-11-26 14:13:32
【问题描述】:

我有一个包含对象 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'
     }
    ]

还有一个带有 ids 的数组 B:

B = [12345, 12348]

我想根据 B 中的 id 从 A 中过滤/获取带有“文件夹”+“名称”的新数组

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

不确定如何根据 B 中的 id 来“过滤”A?

【问题讨论】:

标签: javascript arrays node.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    只是另一种方法;使用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 取决于两个数组的大小可以不可能是优化。

    【讨论】:

      【解决方案3】:
      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

      【讨论】:

        【解决方案4】:

        您可以在循环中创建一个循环来执行此操作。检查第一个数组的每个元素,然后如果 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>
        

        【讨论】:

          【解决方案5】:

          brso05 说的差不多。

          只需使用类似于此 sn-p 的简单 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);
              }
          }
          

          结合这一点,以下 sn-p 应该足以满足您的需求:

          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);
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:
            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);
            

            【讨论】:

              猜你喜欢
              • 2023-03-04
              • 1970-01-01
              • 2021-09-28
              • 2016-11-03
              • 2015-09-13
              • 2017-09-08
              • 1970-01-01
              • 1970-01-01
              • 2017-05-04
              相关资源
              最近更新 更多