2016-07-08 8 views
1

を持つオブジェクト内のオブジェクトを通じてスクリプトをループする出力:現在の下Object.assign

{ 
    "title1": { 
     "0": "undefined" 
    }, 
    "title2": "& three", 
    "title3": "& four" 
} 

所望の出力ビーイング:

{ 
     "title1": { 
     "nested1": "one", 
     "nested2": "& two" 
     }, 
     "title2": "& three ", 
     "title3": "& four" 
    } 

私の質問が正常にif文で必要とされるものです[key] [innerKey]のプロパティをループし、エンコード関数に渡して 'out'に戻しますか?

私は、if文の最初の部分でforループを使用して成功しなくてもそれを解決しようとしています。 [キー]のすべてのプロパティをループ次いで

  • :ARR [キー]
  • し、[キー]出力オブジェクトの場合

    • :私はそれの線に沿って論理に従うことを必要と把握します
    • と機能エンコード
    • を介してそれらを渡すと

    おかげで「アウト」に戻します。

    var arr = { 
        "title1": { 
        "nested1": "one", 
        "nested2": "& two" 
        }, 
        "title2": "& three ", 
        "title3": "& four" 
    }; 
    
    var encodedValues = Object.keys(arr).reduce(function(out,key,innerKey) { 
    
        if (typeof arr[key] == "object") { 
        return Object.assign(out, {[key]: {[innerKey]: encode(arr[key][innerKey])}}) 
    
        } else { 
        return Object.assign(out, {[key]: encode(arr[key])}) 
        } 
    
    }, {}); 
    
    console.log(encodedValues) 
    
  • +0

    期待どおりの出力を投稿できますか?私はあなたが達成しようとしていることを理解していない... – rpadovani

    +1

    はいはい。明快さの欠如のために申し訳ありません。元の投稿を更新しました。 – fivedoor

    +0

    オブジェクトの深さは常に== 1になりますか? – markusthoemmes

    答えて

    1

    どのようにこのような何かについては? (再帰)

    var arr = { 
        "title1": { 
        "nested1": "one", 
        "nested2": "& two" 
        }, 
        "title2": "& three ", 
        "title3": "& four" 
    }; 
    
    var encode = function(val){ return encodeURI(val) }; 
    
    var encodeValues = function(arr){ 
        var obj = {}; 
        for(var key in arr){ 
        if(typeof arr[key] == "object"){ 
         obj[key] = encodeValues(arr[key]); 
        }else{ 
         obj[key] = encode(arr[key]); 
        } 
        } 
        return obj; 
    }; 
    
    var encodedValues = encodeValues(arr); 
    
    console.log(encodedValues); 
    
    +0

    ありがとうございます。これは私がテストしたときに完全に機能しました。関数内でencodeValuesを参照すると、これは再帰関数になります。 – fivedoor

    +0

    正確に。私は再帰を使う機会に飛びます:p –

    2

    私はこのような何かが動作するはずだと思う:ES5で

    function encodeValues(arr) { 
        Object.keys(arr).forEach(item => { 
        if (typeof arr[item] === "object") encodeValues(arr[item]); 
        else arr[item] = encode(arr[item]); 
        }); 
        return arr; 
    } 
    
    var encodedValues = encodeValues(arr); 
    

    同じコード:

    function encodeValues(arr) { 
        var keys = Object.keys(arr); 
        for (var i = 0; i < keys.length; i++) { 
        if (typeof arr[keys[i]] === "object") encodeValues(arr[keys[i]]); 
        else arr[keys[i]] = encode(arr[keys[i]]); 
        } 
    return arr; 
    } 
    
    var encodedValues = encodeValues(arr); 
    

    これはあなたが持っているすべての深さ(他のオブジェクトにネストされたオブジェクト)のために働くことができます

    +0

    ありがとうございます。奇妙なことに、私はちょうど、上記とconsole.log(encodedValues)の両方を実装しました。 undefinedが返されます。ダブルチェックします。 – fivedoor

    +0

    @fivedoor ups、申し訳ありませんが、私はES5バージョンをテストしていませんでしたが、私は間違いを犯しました。 – rpadovani

    +0

    ああ、はい、申し訳ありません私はパットの解決策をしばらく振っていました。ご協力いただきありがとうございます! – fivedoor

    関連する問題