如何通过内部数组内的元素过滤对象数组 - 函数式编程Javascript

时间:2017-04-26 10:59:09

标签: javascript arrays

仍在通过函数式编程工作:.forEach(),. map(),. filter(),. reduce()。

我正在接受新的挑战。

var bikes = [
   {name: 'Cinelli Bolt', price: '2000', age: 1, singlespeed: 'yes', features: ['tubeless tires', 'disk brakes', 'carbon frame']},
   {name: 'Cinelli Mash', price: '1700', age: 3, singlespeed: 'yes', features: ['gatorskin tyres', 'sram drivetrain', 'steel frame']},
   {name: 'Specialized Langster', price: '1000', age: 1, singlespeed: 'no', features: ['two speed enclosed hub', 'bullbars', 'carbon frame']}
 ]; 

我试图通过特定功能'碳框架过滤阵列'。我在考虑使用过滤器,但我对调用key.value对中的功能感到困惑。

var justCarbonBikes = bikes.filter(function(bike) {
  return bike.features['carbon frame'];
});

预期结果应修改原始数组:

var bikes = [
   {name: 'Cinelli Bolt', price: '2000', age: 1, singlespeed: 'yes', features: ['tubeless tires', 'disk brakes', 'carbon frame']},
   {name: 'Specialized Langster', price: '1000', age: 1, singlespeed: 'no', features: ['two speed enclosed hub', 'bullbars', 'carbon frame']}
 ]; 

2 个答案:

答案 0 :(得分:2)

你快到了。通过使用Array#indexOf检查索引,您可以将其用作返回值。

return bike.features.indexOf('carbon frame') + 1;



var bikes = [{ name: 'Cinelli Bolt', price: '2000', age: 1, singlespeed: 'yes', features: ['tubeless tires', 'disk brakes', 'carbon frame'] }, { name: 'Cinelli Mash', price: '1700', age: 3, singlespeed: 'yes', features: ['gatorskin tyres', 'sram drivetrain', 'steel frame'] }, { name: 'Specialized Langster', price: '1000', age: 1, singlespeed: 'no', features: ['two speed enclosed hub', 'bullbars', 'carbon frame'] }],
    justCarbonBikes = bikes.filter(function(bike) {
        return bike.features.indexOf('carbon frame') + 1;
    }),
    bikesWithoutCarbon = bikes.filter(function(bike) {
        return bike.features.indexOf('carbon frame') === -1;
    });

console.log(justCarbonBikes);
console.log(bikesWithoutCarbon);

.as-console-wrapper { max-height: 100% !important; top: 0; }




ES6,Array#includes作为返回值。



var bikes = [{ name: 'Cinelli Bolt', price: '2000', age: 1, singlespeed: 'yes', features: ['tubeless tires', 'disk brakes', 'carbon frame'] }, { name: 'Cinelli Mash', price: '1700', age: 3, singlespeed: 'yes', features: ['gatorskin tyres', 'sram drivetrain', 'steel frame'] }, { name: 'Specialized Langster', price: '1000', age: 1, singlespeed: 'no', features: ['two speed enclosed hub', 'bullbars', 'carbon frame'] }],
    justCarbonBikes = bikes.filter(b => b.features.includes('carbon frame')),
    bikesWithoutCarbon = bikes.filter(b => !b.features.includes('carbon frame'));

console.log(justCarbonBikes);
console.log(bikesWithoutCarbon);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

这是一个解决方案,您可以遍历过滤器功能中的功能,如果找到碳帧,则返回

var justCarbonBikes = bikes.filter(function(bike) {
  for(let i of bike.features){
    if(i == 'carbon frame'){
      return bike
    }
  }
});