我将所有答案拆分为 4 种可能的解决方案:
- 使用对象
{ }
防止重复
- 使用辅助数组
[ ]
- 用
filter + indexOf
- 奖金!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)];
}
我想知道哪个更快。我制作了示例 Google Sheet来测试功能。注意:ECMA 6 在 Google 表格中不可用,因此我无法对其进行测试。
以下是测试结果:
我希望看到使用 object 的代码{ }
会获胜,因为它使用了哈希。所以我很高兴测试在 Chrome 和 IE 中显示了该算法的最佳结果。感谢@rab 提供代码。
2020 年更新
谷歌脚本启用 ES6 引擎。现在我测试了最后一个代码,Sets
它看起来比对象方法更快。