JS /下划线:_.groupBy或_.uniq获取字段的唯一/分组元素是

时间:2017-09-13 20:15:49

标签: javascript ecmascript-6 underscore.js

mongoDB查询给我一个像这样的结果数组:

var result = [
  {
    _id: 'GrRQ56ZvTGpSajvCr',
    title: 'Element 1'
    meta: {
      groupId: '1'
    }
  },
  {
    _id: 'nQs7T5QZcjbyxe6Yh',
    title: 'Element 2'
    meta: {
      groupId: '1'
    }
  },
  {
    _id: 'cbDqv6ExZoYJQJLnP',
    title: 'Element 3'
    meta: {
      groupId: '2'
    }
  },
  {
    _id: 'v6ExZoYcbDqJQJLnP',
    title: 'Element 4'
    meta: {
      groupId: '2'
    }
  },
  {
    _id: 'qbqiEGwsGyprfutZM',
    title: 'Element 5'
    meta: {
    }
  },
  {
    _id: 'rfutZMqbqiEGwsGyp',
    title: 'Element 6'
    meta: {
    }
  }
]

现在我需要输出没有groupID的每个元素,并且每个相同的groupId只输出一个元素。 (我不能直接在我的mongoDB查询中使用distinctaggregate,所以我必须使用此结果)

所以我想考虑使用_.unique_.groupBy

const resultGroupBy = _.groupBy(result, function(element) { return element.meta.groupId })
const resultUnique = _.uniq(result, function(item, key, a) { return item.a }) // don't understand the syntax for this :-(

但两者都没有按要求工作。

我的结果应该是:

groupedResult.map((element) => {
  console.log(element.title, kindOfCounter)
})

Element 1, 2 // Two elements for group 1
Element 3, 2 // Two elements for group 2
Element 5, 1 // Single element without group
Element 6, 1 // Single element without group

元素2和元素4被删除,因为组1和组2应该只由一个元素表示,尽管开头有两个元素。

1 个答案:

答案 0 :(得分:0)

我认为_.uniq应该做你想做的事。



var result = [
  {
    _id: 'GrRQ56ZvTGpSajvCr',
    title: 'Element 1',
    meta: {
      groupId: '1'
    }
  },
  {
    _id: 'nQs7T5QZcjbyxe6Yh',
    title: 'Element 2',
    meta: {
      groupId: '1'
    }
  },
  {
    _id: 'cbDqv6ExZoYJQJLnP',
    title: 'Element 3',
    meta: {
      groupId: '2'
    }
  },
  {
    _id: 'v6ExZoYcbDqJQJLnP',
    title: 'Element 4',
    meta: {
      groupId: '2'
    }
  },
  {
    _id: 'qbqiEGwsGyprfutZM',
    title: 'Element 5',
    meta: {
    }
  },
  {
    _id: 'rfutZMqbqiEGwsGyp',
    title: 'Element 6',
    meta: {
    }
  }
];

var resultUniq = _.uniq(result, e => e.meta.groupId);
console.log(resultUniq.map(e => e.title));

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

Element 6未包含在结果中,因为它没有groupId。您可以更改iteratee函数,以便在e.meta.groupId未定义时返回默认值。