如何制作具有唯一元素的数组(即删除重复项)?

新手上路,请多包涵

我有这段代码:

 var ar = [10,7,8,3,4,7,6];

function isin(n,a){
  for (var i=0;i<a.length;i++){
    if (a[i]== n) {
      var b = true;
      return b;
    } else {
      var c = false;
      return c;
   }
  }
}

function unique(a){
  var arr = [];
  for (var i=0;i<a.length;i++){
    if (!isin(a[i],arr)){
      arr.push(a[i]);
    }
  }

 return arr;
}

alert(unique(ar));

在此代码中,我尝试从原始数组创建新的唯一数组(没有重复项)。但我仍然得到原始数组!我的错误在哪里?

原文由 DrStrangeLove 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 188
2 个回答

使用普通数组并返回关联数组的键(仅包含给定数组中的“唯一”值)效率更高:

 function ArrNoDupe(a) {
    var temp = {};
    for (var i = 0; i < a.length; i++)
        temp[a[i]] = true;
    var r = [];
    for (var k in temp)
        r.push(k);
    return r;
}

$(document).ready(function() {
    var arr = [10, 7, 8, 3, 4, 3, 7, 6];
    var noDupes = ArrNoDupe(arr);
    $("#before").html("Before: " + arr.join(", "));
    $("#after").html("After: " + noDupes.join(", "));
});
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="before"></div>
<div id="after"></div>

注意: 该函数不保留项目的顺序,因此如果这很重要,请使用不同的逻辑。

对于 IE9 和所有其他现代浏览器(例如 Chrome、Firefox),使用 Object.keys() 方法可以变得更加高效:

 function ArrNoDupe(a) {
    var temp = {};
    for (var i = 0; i < a.length; i++)
        temp[a[i]] = true;
    return Object.keys(temp);
}

$(document).ready(function() {
    var arr = [10, 7, 8, 3, 4, 3, 7, 6];
    var noDupes = ArrNoDupe(arr);
    $("#before").html("Before: " + arr.join(", "));
    $("#after").html("After: " + noDupes.join(", "));
});
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="before"></div>
<div id="after"></div>

感谢 wateriswet 提醒 我注意这一点。 :)

原文由 Shadow The Kid Wizard 发布,翻译遵循 CC BY-SA 3.0 许可协议

或者对于那些寻找单线(简单而实用)的人:

 var a = ["1", "1", "2", "3", "3", "1"];
var unique = a.filter(function(item, i, ar){ return ar.indexOf(item) === i; });

原文由 Josh Mc 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题