0

表記法 (「main:message:new」など) を、参照されるオブジェクト プロパティ (resource[main][message][new]) に変換する必要があります。

var notation = 'main:message:new';

var ressource = {
    message: { new: 'something' }
};

var splitKeys = function(keys, object) {
    var keys, pointer;
    pointer = object;
    keys = keys.split(':');
    for (i = 0; i < keys.length; i++) {
        // here is the error
        if (pointer[keys[i]] === undefined) break;
        pointer = pointer[keys[i]];
    }
    return pointer;
};

console.log(splitKeys(notation, ressource));

ご覧のとおり、エラー処理に問題がありました。具体的なリソースと一致しないリソース表記がある場合は、何も返しません。残念ながら、「未定義のプロパティを読み取れません」というエラーが常にスローされます...

4

2 に答える 2

2

と呼ばれる最初のプロパティ名mainはリソース オブジェクトに存在しないため、メソッドは目的のプロパティ値ではなく常にオブジェクト全体を返します{ new: 'something' }

var splitKeys = function(keys, object) {
    var pointer = object;
    var parent = pointer;
    keys = keys.split(':').slice(1); // exclude `main`
    for (var i = 0; i < keys.length; i++) {
        if (pointer[keys[i]] === undefined) break;
        parent = pointer;
        pointer = pointer[keys[i]];
    }
    return parent;
};

newこれにより、オブジェクト、つまりが返されます{ new: 'something' }。代わりにプロパティ値を返したい場合は、代わりに returnpointerを使用してparentください。

デモ

于 2012-09-22T14:54:49.120 に答える
0

あなたのコードではエラーが発生しないため、他の問題がある可能性があります。

ただし、リソースが一致しないときに何も返したくない場合は、return代わりにbreak.

var notation = 'main:message:new';

var ressource = {
    message: { new: 'something' }
};

var splitKeys = function(keys, object) {
    var keys, pointer;
    pointer = object;
    keys = keys.split(':');
    for (i = 0; i < keys.length; i++) {

        if (pointer[keys[i]] === undefined) 
            return null;

        pointer = pointer[keys[i]];
    }
    return pointer;
};

console.log(splitKeys(notation, ressource));

また、pointer[keys[i]]isnullの場合、ループが続行されるため、テストを変更することをお勧めします。

if (pointer[keys[i]] == null)

nullこれにより、との両方がチェックされundefinedます。

于 2012-09-22T14:57:01.583 に答える