2017-04-26 41 views
1

仍然按照函数式编程的方式工作:.forEach(),.map(),.filter(),.reduce()。如何通过内部数组内部的元素过滤对象数组 - 功能性编程Javascript

我正在通过一项新的挑战。

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

返回你几乎在那里。通过检查索引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; }

+0

我怎么能否定这个功能:所有没有“碳框架”功能的自行车? – user6456392

+1

您可以检查结果或否定它,就像使用include一样。 –

1

这是一个解决方案,可以通过过滤器功能内部的功能循环和如果发现碳帧

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

不错,我喜欢这种筛选,因为你可以具体agains一定的标准:如果我想所有不在碳纤维车架的自行车。 – user6456392

相关问题