2016-12-07 114 views
1

我正在尝试使用React JS创建搜索。通过阵列与另一个阵列进行过滤

我有一个数组(汽车),我想通过它搜索。我有一个过滤器阵列(在这种情况下是一个),我需要应用。最后,我拥有该过滤器的内容。

我有这样三个数组对象:

  • 汽车(全车的列表)。它看起来如下:

    let cars = [ 
        {"id":20,"listID":3,"make":"Golf"}, 
        {"id":21,"listID":3,"make":"Passat"}, 
        {"id":22,"listID":3,"make":"Audi"}, 
        {"id":23,"listID":3,"make":"Touran"}, 
        {"id":24,"listID":3,"make":"Touran"} 
    ]; 
    
  • 过滤器(阵列的所有过滤器 - 在这种情况下,只有一个过滤器):

    let filters = [ 
         {"name":"FAVORITES","values":[  
               {"carID":21,"listID":3,"userID":12}, 
               {"carID":22,"listID":3,"userID":12} 
              ] 
         } 
    ]; 
    
  • 夹(即过滤器的内容):

    let favorites = [ 
        {"carID":21,"listID":3,"userID":12}, 
        {"carID":22,"listID":3,"userID":12} 
    ]; 
    

渲染功能如下:

render(){ 
    return cars.filter(car => filters.every(filter => filterItem(filter, car))) 
} 

因此,我过滤所有的汽车,应用每个过滤器,然后调用每个汽车和每个过滤器的filterItem函数。

和功能的FilterItem(这里我想要得到的结果)如下:

function filterItem(filter, car) { 
    switch(filter.name) { 
     case "FAVORITES": 
       return filter.values.map(f => f).every(v => car.id === v.carID && car.listID === v.listID); 
     default: 
      return true; 
    } 
} 

这一切都在一个部件结合:

let favorites = [ 
    {"carID":21,"listID":3,"userID":12}, 
    {"carID":22,"listID":3,"userID":12} 
]; 


let cars = [ 
    {"id":20,"listID":3,"make":"Golf"}, 
    {"id":21,"listID":3,"make":"Passat"}, 
    {"id":22,"listID":3,"make":"Audi"}, 
    {"id":23,"listID":3,"make":"Touran"}, 
    {"id":24,"listID":3,"make":"Touran"} 
]; 

let filters = [ 
    {"name":"FAVORITES","values":[ 
           {"carID":21,"listID":3,"userID":12},  
           {"carID":22,"listID":3,"userID":12} 
           ] 
    } 
] 

function filterItem(filter, car) { 
    switch(filter.name) { 
     case "FAVORITES": 
      return filter.values.map(f => f).every(v => car.id === v.carID && car.listID === v.listID); 
     default: 
      return true; 
    } 
} 

class Test extends React.Component { 
    render(){ 
     return (
     <div> 
      {cars.filter(car => filters.every(filter => filterItem(filter, car)))} 
     </div> 
    ) 
    } 
} 

React.render(<Test />, document.getElementById('container')); 

因此我想通过汽车搜索,并应用所有过滤器(在这种情况下只有一个)并获得结果。

因此,在这种情况下,结果应该是:

let results = [ 
    {"id":21,"listID":3,"make":"Passat"}, 
    {"id":22,"listID":3,"make":"Audi"} 
] 

但是我的代码我什么也没得到。

有什么建议吗?

Here is fiddle.

回答

2

你问如果一个car对象匹配的值的everyfilter,它做不到的。你想写的是什么,我认为是somesome检查过滤器中是否有匹配的值之一。例如:

let favorites = [ 
 
    {"carID":21,"listID":3,"userID":12}, 
 
    {"carID":22,"listID":3,"userID":12} 
 
]; 
 

 

 
let cars = [ 
 
    {"id":20,"listID":3,"make":"Golf"}, 
 
    {"id":21,"listID":3,"make":"Passat"}, 
 
    {"id":22,"listID":3,"make":"Audi"}, 
 
    {"id":23,"listID":3,"make":"Touran"}, 
 
    {"id":24,"listID":3,"make":"Touran"} 
 
]; 
 

 
let filters = [ 
 
    {"name":"FAVORITES","values":[ 
 
     {"carID":21,"listID":3,"userID":12},  
 
     {"carID":22,"listID":3,"userID":12} 
 
    ] 
 
    } 
 
] 
 

 
function filterItem(filter, car) { 
 
    switch(filter.name) { 
 
     case "FAVORITES": 
 
      return filter 
 
       .values 
 
      // Here, we change `every` to `some`, since a car has to match only ONE value 
 
       .some(v => car.id === v.carID && car.listID === v.listID); 
 
     default: 
 
      return true; 
 
    } 
 
} 
 

 
var favFilter = filterItem.bind(null, filters[0]); 
 
var filteredCars = cars.filter(favFilter); 
 
console.log(filteredCars);

+0

我解决它了。这就是解决方案。 :) , 不管怎么说,还是要谢谢你。 – Boky