使用_.uniqBy来保存lodash中具有较大键值的对象

时间:2017-01-16 07:37:06

标签: javascript lodash

JSFiddle Example

let obj = [{'vote':999,'name':'D'},
           {'vote':341,'name':'A'},
           {'vote':789,'name':'A'},
           {'vote':555,'name':'B'}]

let result = _.uniqBy(obj,(item)=>{
  return item.name
})
result = _.orderBy(result,(item)=>{
  return item.mid
},['desc'])

我想删除重复的按名称。在这种情况下,我希望{'vote':341,'name':'A'}被删除,因为它的选票少于另一个。 有没有办法比较_.uniqBy期间的投票值?

我还尝试在_.orderBy之前首先运行_.uniqBy,但无法保证{'vote':341,'name':'A'}将被移除。

Example

我正在使用lodash 4.3

1 个答案:

答案 0 :(得分:3)

您可以尝试这种纯粹的JS方法:

let obj = [{'vote':999,'name':'D'},{'vote':341,'name':'A'},{'vote':789,'name':'A'},{'mid':555,'name':'B'}]
let result = [];
obj.reduce(function(p, c){
  if(p[c.name] === undefined){
    result.push(c);
    p[c.name] = c.vote;
  }
  else if(c.vote > p[c.name]){
    let o = result.find(x=> x.name === c.name);
    o.vote = c.vote
  }
  return p;
}, {});

console.log(result)

Lodash方法

<强>逻辑

  • name按升序排序数组,按vote按降序排序。
  • 现在使用_.uniqBy,因为它会选择第一次出现。

注意:我无法使用lodash(4.17)进行排序(没有使用过多),所以我使用纯JS对其进行排序。

Lodash 4.17

正如@ Ori Drori正确指出的那样,我们应该使用_.sortedUniqBy代替_.uniqBy,因为它针对排序数组进行了优化。

let obj = [{'vote':999,'name':'D'},{'vote':341,'name':'A'},{'vote':789,'name':'A'},{'mid':555,'name':'B'}]

var sortedArray = obj.sort(function(a,b){
  return a.name.localeCompare(b.name) || b.vote - a.vote
});

var result = _.sortedUniqBy(sortedArray, 'name');
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Lodash 3.10

let obj = [{'vote':999,'name':'D'},{'vote':341,'name':'A'},{'vote':789,'name':'A'},{'mid':555,'name':'B'}]

var result =_.uniq(
              _.sortByOrder(
                obj, 
                ["name", "vote"], 
                ["asc", "desc"]
              ), "name");
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>