首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JScript 數組去重邏輯錯誤:for...in 遍歷得到的是索引而非值

     編輯:程式設計綜合問答

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;
}

問題現象

  • 隨機數範圍 0-25,0 永遠無法添加:索引 "0" 與值 0 相等,誤判為重複
  • 其他數字若恰好等於某索引值也會被誤判
  • 真正的重複值未被檢測(比較的是索引)

修正方案

1. 使用索引訪問值


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;
}

2. 標準 for 循環(推薦,性能更好)


function hasFigure(x, arr) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == x) return true;
    }
    return false;
}

3. 現代 JS:includes / indexOf / Set(非 JScript 環境)


// 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 不支持
  • 數組去重核心:值比較,而非索引比較
  • JScript 為微軟 ECMA 3 實現,不支持現代 Array 方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved