1. ホーム
  2. javascript

[解決済み] 未定義のプロパティ 'Symbol(Symbol.iterator)' が読み込めない

2022-02-26 02:39:49

質問

ある配列をループして、指定された関数を通過するアイテムが含まれているかどうかをチェックしようとしています。これを行うには、Arrayオブジェクトに.any()プロトタイプを追加します。

Array.prototype.any = (comparator) => {
    for(let item of this){
        if(comparator(item)){
            return true;
        }
    }
    return false;
};

そして、Array.any()のように呼び出す。

else if(users && users.any((user) => user.userName === user.userName)){
        res.status(400).send('Username already in use');
}

しかし、これでは次のようなエラーが発生します。

TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined
at Array.any (C:\dev\nodejs\testproject\dist\routes\userRoutes.js:29:39)
at C:\dev\nodejs\testproject\dist\routes\userRoutes.js:87:56
at Query.<anonymous> (C:\dev\nodejs\testproject\node_modules\mongoose\lib\model.js:3748:16)
at C:\dev\nodejs\testproject\node_modules\kareem\index.js:277:21
at C:\dev\nodejs\testproject\node_modules\kareem\index.js:131:16
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)

このエラーは、プロトタイプ関数内の 'this' が未定義であることを示唆しているように思えますが、 'this' は、未定義であることをチェックしたユーザー配列です。

何が問題を引き起こしているのかよくわからないのですが、助けていただけると幸いです。

解決方法を教えてください。

唯一の答えは、あなたが "function" を使用していないため、あなたの "this" があなたの "users" になっていないことです。これならうまくいくでしょう。

Array.prototype.any = function(comparator) {
    for(let item of this){
        if(comparator(item)){
            return true;
        }
    }
    return false;
};

そして、もちろん、"some"を使うだけです。