{
collectionId: 1,
category: 'a',
collectionType: 'typea'
}, {
collectionId: 1,
category: 'a',
collectionType: 'typea'
}, {
collectionId: 1,
category: 'b',
collectionType: 'typea'
}, {
collectionId: 2,
category: 'b',
collectionType: 'typeb'
}, {
collectionId: 2,
category: 'b',
collectionType: 'typeb'
},
我如何处理以下用例:
A)具有相同collectionType和相同类别的2本书: 这两本书应该组合在一起,并在该类别中显示为集合
B)2本书具有相同的集合类型但不同的类别: 这两本书应该组合在一起,并在一个名为" My Collection"的独立书架中显示为集合。 (此书架是书架上其他类别的补充)
C)3本书具有相同的集合类型但2本书具有相同的类别,1本书具有不同的类别: 所有3本书应该组合在一起,并在称为" My Collection"的单独书架中显示为集合。 (此书架是书架上其他类别的补充)
答案 0 :(得分:0)
var LIMIT = 2,
C_LIMIT = 3;
// A
_(coll)
.chain()
.groupBy(i => i.collectionType.concat(i.category))
.findWhere(i => i.length > LIMIT)
.first(LIMIT)
.value();
// B
_(coll)
.chain()
.groupBy('collectionType')
.mapObject(i => _(i).indexBy('category'))
.values()
.findWhere(i => _(i).keys().length >= LIMIT)
.values()
.first(LIMIT)
.value();
// C
_(coll)
.chain()
.groupBy('collectionType')
.mapObject(function(i) {
return _(i)
.chain()
.groupBy('category')
.values()
.map(v => _(v).first(LIMIT))
.sortBy('length')
.reverse()
.flatten()
.first(C_LIMIT)
.value()
})
.values()
.findWhere(i => i.length === C_LIMIT)
.value();
var coll = [{
collectionId: 1,
category: 'a',
collectionType: 'typea'
}, {
collectionId: 1,
category: 'a',
collectionType: 'typea'
}, {
collectionId: 1,
category: 'b',
collectionType: 'typea'
}, {
collectionId: 2,
category: 'b',
collectionType: 'typeb'
}, {
collectionId: 2,
category: 'b',
collectionType: 'typeb'
}];
var LIMIT = 2,
C_LIMIT = 3,
el = document.getElementById('result');
var a = _(coll)
.chain()
.groupBy(i => i.collectionType.concat(i.category))
.findWhere(i => i.length > LIMIT)
.first(LIMIT)
.value();
var b = _(coll)
.chain()
.groupBy('collectionType')
.mapObject(i => _(i).indexBy('category'))
.values()
.findWhere(i => _(i).keys().length >= LIMIT)
.values()
.first(LIMIT)
.value();
var c = _(coll)
.chain()
.groupBy('collectionType')
.mapObject(function(i) {
return _(i)
.chain()
.groupBy('category')
.values()
.map(v => _(v).first(LIMIT))
.sortBy('length')
.reverse()
.flatten()
.first(C_LIMIT)
.value()
})
.values()
.findWhere(i => i.length === C_LIMIT)
.value();
el.innerHTML = _([a, b, c]).map(x => JSON.stringify(x)).join('<br><br>');
&#13;
<script src="http://underscorejs.org/underscore-min.js"></script>
<div id="result"></div>
&#13;