JScript(WSH 環境)中向數組添加不重複隨機數,去重函數 hasFigure 使用 for...in 遍歷數組,誤將索引當作值比較,導致 0 無法添加、重複值未過濾。本文分析錯誤並提供修正方案。
function hasFigure(x, arr) {
if (arr.length == 0) return false;
for (var item in arr) { // item 是索引 "0", "1", "2"...
if (item == x) { // 比較索引與值
return true;
}
}
return false;
}
function hasFigure(x, arr) {
if (arr.length == 0) return false;
for (var i in arr) { // i 是索引
if (arr[i] == x) { // 訪問 arr[i] 獲取值
return true;
}
}
return false;
}
function hasFigure(x, arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == x) return true;
}
return false;
}
// ES6+
const hasFigure = (x, arr) => arr.includes(x);
// 或
const hasFigure = (x, arr) => arr.indexOf(x) !== -1;
// 去重最簡
const unique = [...new Set(arr)];
(function() {
var arr = [];
for (var i = 0; i < 50; i++) {
var r = rand();
var whether = hasFigure(r, arr);
if (!whether) {
arr.push(r);
}
WScript.Echo("< " + r + ">" + "[" + whether + "]");
}
WScript.Echo(arr.join(","));
})();
function rand() {
return Math.floor(Math.random() * 26);
}
function hasFigure(x, arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == x) return true;
}
return false;
}
for...in 遍歷對象/數組的可枚舉屬性名(數組為索引字符串)for...of (ES6) 遍歷值,但 JScript 不支持