0

両方の値を保持しながら、2 つのオブジェクトを一緒に圧縮する必要がある状況があります。両方のオブジェクトを反復処理して、すべてのキーの配列を作成できます。

    var traverse = function (obj, chain) {

        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {

                var tempChain = [].concat(chain || []);
                tempChain.push(prop);

                if (typeof obj[prop] === 'object') {
                    traverse(obj[prop], tempChain);
                }
                console.log(tempChain);
            }
        }
    };

以下を渡します。

    traverse({
        'a': {
            'b': 'hello world',
            'b1': 'hello world 1',
            'c': {
                'd': 'dello'
            }
        }
    })

私を返します:

[a]
[a,b]
[a,b1]
[a,c]
[a, c, d]

これで、オブジェクトにネストされたプロパティの配列ができました。基本的にobj[[a、c、d]]にアクセスするにはどうすればよいですか? eval で問題を解決できることはわかっていますが、内容は信頼できません。

eval('window.' + ['a','c','d'].join('.')); 

その配列をループして、プロパティが両方に存在するかどうかを確認できる場合は、結合された「圧縮された」値の新しいオブジェクトを構築します。

4

1 に答える 1

1

おそらくこのようなものですか?

function getValueAt(obj, keyPathArray) {
    var emptyObj = {};

    return keyPathArray.reduce(function (o, key) {
        return (o || emptyObj)[key];
    }, obj);
}

次に、次のように使用できます。

var o = { a: { c: { d: 1 } } };

getValueAt(o, ['a', 'c', 'd']); //1

ただし、短絡しないため、存在しないプロパティに対しては効率的ではありません。を使用しない別のアプローチを次に示しreduceます。

function getValueAt(o, keyPathArray) {
    var i = 0, 
        len = keyPathArray.length;

    while (o != null && i < len) o = o[keyPathArray[i++]];

    return o;    
}
于 2013-10-04T12:04:00.280 に答える