首页 > JavaScript > 从 JS 数组中删除重复值?

从 JS 数组中删除重复值?

上一篇 下一篇

我有一个数字数组,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上发现了另一个脚本,它看起来几乎和它一模一样,但它并没有失败。

所以为了帮助我学习,有人可以帮助我确定原型脚本出错的地方吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

  • 从 JS 数组中删除重复值

类似的问题:

  • 获取数组中的所有非唯一值(即:重复/多次出现)

分割线

网友回答:

ES6/ES2015 的更新答案:使用 Set 和点差运算符(感谢 le-m),单行解决方案为:

let uniqueItems = [...new Set(items)]

哪个返回

[4, 5, 6, 3, 2, 23, 1]

分割线

网友回答:

JavaScript 1.6 / ECMAScript 5 中,你可以通过以下方式使用 Array 的本机方法来获取具有唯一值的数组:filter

function onlyUnique(value, index, self) {
  return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter(onlyUnique);

console.log(unique); // ['a', 1, 2, '1']

本机方法将遍历数组,只保留那些传递给定回调函数的条目。filteronlyUnique

onlyUnique检查给定的值是否是第一个出现。如果不是,则它必须是重复的,不会被复制。

该解决方案无需任何额外的库(如jQuery或prototype.js)即可工作。

它也适用于具有混合值类型的数组。

对于不支持本机方法的旧浏览器(<ie9),您可以在 MDN 文档中找到过滤器和索引的解决方法。filterindexOf

如果要保留某个值的最后一次出现,只需替换为 。indexOflastIndexOf

使用 ES6,这可以缩短为:

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);

console.log(unique); // unique is ['a', 1, 2, '1']

感谢卡米洛·马丁在评论中的提示。

ES6 有一个本机对象来存储唯一值。要获取具有唯一值的数组,您现在可以执行以下操作:Set

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)];

console.log(unique); // unique is ['a', 1, 2, '1']

的构造函数采用可迭代对象,如数组,展开运算符将集合转换回数组。感谢卢卡斯·利斯的评论提示。Set...

分割线

网友回答:

我将所有答案分为 4 个可能的解决方案:

  1. 使用对象防止重复{ }
  2. 使用帮助程序数组[ ]
  3. filter + indexOf
  4. 奖金!ES6方法。Sets

以下是答案中的示例代码:

使用对象防止重复{ }

function uniqueArray1( ar ) {
  var j = {};

  ar.forEach( function(v) {
    j[v+ '::' + typeof v] = v;
  });

  return Object.keys(j).map(function(v){
    return j[v];
  });
} 

使用帮助程序数组[ ]

function uniqueArray2(arr) {
    var a = [];
    for (var i=0, l=arr.length; i<l; i++)
        if (a.indexOf(arr[i]) === -1 && arr[i] !== '')
            a.push(arr[i]);
    return a;
}

filter + indexOf

function uniqueArray3(a) {
  function onlyUnique(value, index, self) { 
      return self.indexOf(value) === index;
  }

  // usage
  var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

  return unique;
}

使用 ES6 [...new Set(a)]

function uniqueArray4(a) {
  return [...new Set(a)];
}

我想知道哪一个更快。我制作了示例谷歌表格来测试功能。注意:ECMA 6 在 Google 表格中不可用,所以我无法对其进行测试。

我希望看到使用对象的代码会获胜,因为它使用哈希。所以我很高兴测试显示了这种算法在Chrome和IE中的最佳结果。感谢@rab的代码。{ }

2020 年更新

谷歌脚本启用了ES6引擎。现在我测试了最后一个代码,它看起来比对象方法更快。Sets

模板简介:该模板名称为【从 JS 数组中删除重复值?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 170次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-11
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信图片 html5 单页式简历模板 自适应 微信素材 微信文章 企业网站 响应式 微信模板 微信公众平台
您可能会喜欢的其他模板