为了账号安全,请及时绑定邮箱和手机立即绑定

从JS数组中删除重复值

从JS数组中删除重复值

慕森王 2019-05-23 10:24:55
从JS数组中删除重复值我有一个非常简单的JavaScript数组,可能包含也可能不包含重复项。var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];我需要删除重复项并将唯一值放在一个新数组中。我可以指出我尝试的所有代码,但我认为它没用,因为它们不起作用。我也接受jQuery解决方案。
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

厌倦了看到所有使用for循环或jQuery的坏例子。Javascript现在拥有完美的工具:排序,映射和缩小。


Uniq在保持现有订单的同时减少

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];


var uniq = names.reduce(function(a,b){

    if (a.indexOf(b) < 0 ) a.push(b);

    return a;

  },[]);


console.log(uniq, names) // [ 'Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Carl' ]


// one liner

return names.reduce(function(a,b){if(a.indexOf(b)<0)a.push(b);return a;},[]);

更快的uniq与排序

可能有更快的方法,但这个很不错。


var uniq = names.slice() // slice makes copy of array before sorting it

  .sort(function(a,b){

    return a > b;

  })

  .reduce(function(a,b){

    if (a.slice(-1)[0] !== b) a.push(b); // slice(-1)[0] means last item in array without removing it (like .pop())

    return a;

  },[]); // this empty array becomes the starting value for a


// one liner

return names.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]);

2015年更新:ES6版本:

在ES6中,你有集合和传播,这使得删除所有重复项非常容易和高效:


var uniq = [ ...new Set(names) ]; // [ 'Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Carl' ]

根据事件排序:

有人询问是根据有多少个唯一名称来排序结果:


var names = ['Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Nancy', 'Carl']


var uniq = names

  .map((name) => {

    return {count: 1, name: name}

  })

  .reduce((a, b) => {

    a[b.name] = (a[b.name] || 0) + b.count

    return a

  }, {})


var sorted = Object.keys(uniq).sort((a, b) => uniq[a] < uniq[b])


console.log(sorted)


查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 1659 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信