基于条件数组的数组过滤器

时间:2014-11-26 14:13:33

标签: javascript arrays node.js

我有一个包含对象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 = [12345, 12348]

我想基于来自B的ID来过滤/从A获取带有“folder”+“name”的新数组

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

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

6 个答案:

答案 0 :(得分:3)

一种非常快捷的方法是使用filtermap

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

    return acc;
}, []);

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

优于@Clint Powell方法(也非常好,更具可读性/可维护性)的优势在于,您只能通过A.length元素循环,而不是A.length + B.length,具体取决于大小两个数组都不能进行优化。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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