2016-08-29 4 views
2

次のような製品の配列があり、製品の名前順、価格順の順番を考えてみましょう。 lodashを使用してカテゴリごとに最も安価な製品または最も高価な製品を入手するにはどうすればよいですか? filterfirstfilterlastのような機能が必要です。filterfirstとlodashのfilterlast関数

[ 
    { 
     "productId": "123456", 
     "name": "Daiper", 
     "category": "Home", 
     "store": "store1", 
     "pricing": 10 
    }, 
    { 
     "productId": "123457", 
     "name": "Daiper", 
     "category": "Home", 
     "store": "store2", 
     "pricing": 20 
    }, 
    { 
     "productId": "123458", 
     "name": "Daiper", 
     "category": "Home", 
     "store": "store3", 
     "pricing": 30 
    }, 
    { 
     "productId": "123466", 
     "name": "Paint", 
     "category": "Home", 
     "store": "store2", 
     "pricing": 25 
    }, 
    { 
     "productId": "123467", 
     "name": "Paint", 
     "category": "Home", 
     "store": "store1", 
     "pricing": 36 
    }, 
    { 
     "productId": "123468", 
     "name": "Paint", 
     "category": "Home", 
     "store": "store3", 
     "pricing": 80 
    } 
] 
+1

を溶液? –

+1

'chain' - >' filter' - > 'initial(offset)'や 'chain' - >' filter' - > 'slice(offset * -1)'はあなたが望むことをします。遅延評価のためにチェーン全体が実行されるのではなく、必要なだけ多くのものが実行されます。したがって、最初の例では、「オフセット」アイテムに達するとフィルタリングは停止します。 2番目のものは、最初のものと同じになるように書き換えられるかもしれませんが、 'takeWhile'と' takeRightWhile'も興味深いかもしれません。 – vlaz

答えて

2

あなたは、各グループの第一または最後の項目にグループの配列をnameプロパティで項目を_.groupBy()、その後、_.map()することができます:純粋なJSについてどのように

function filterGroups(groupIdProp, predicate) { 
 
    return function(arr) { 
 
    return _(arr) 
 
     .groupBy(groupIdProp) 
 
     .map(predicate) 
 
     .values(); 
 
    } 
 
} 
 

 
var filterFirst = filterGroups('name', function(group) { 
 
    return group[0]; 
 
}); 
 

 
var filterLast = filterGroups('name', function(group) { 
 
    return group[group.length - 1]; 
 
}) 
 

 
var arr = [{ 
 
    "productId": "123456", 
 
    "name": "Daiper", 
 
    "category": "Home", 
 
    "store": "store1", 
 
    "pricing": 10 
 
}, { 
 
    "productId": "123457", 
 
    "name": "Daiper", 
 
    "category": "Home", 
 
    "store": "store2", 
 
    "pricing": 20 
 
}, { 
 
    "productId": "123458", 
 
    "name": "Daiper", 
 
    "category": "Home", 
 
    "store": "store3", 
 
    "pricing": 30 
 
}, { 
 
    "productId": "123466", 
 
    "name": "Paint", 
 
    "category": "Home", 
 
    "store": "store2", 
 
    "pricing": 25 
 
}, { 
 
    "productId": "123467", 
 
    "name": "Paint", 
 
    "category": "Home", 
 
    "store": "store1", 
 
    "pricing": 36 
 
}, { 
 
    "productId": "123468", 
 
    "name": "Paint", 
 
    "category": "Home", 
 
    "store": "store3", 
 
    "pricing": 80 
 
}]; 
 

 
console.log('first', filterFirst(arr)); 
 

 
console.log('last', filterLast(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>