以下划线js

时间:2016-04-26 06:29:27

标签: javascript angularjs underscore.js

{
     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"的单独书架中显示为集合。 (此书架是书架上其他类别的补充)

1 个答案:

答案 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;
&#13;
&#13;