2016-04-19 9 views
1

私は、ネストされたオブジェクトを持つ標準オブジェクトを持っています。lodash一致するキー/ネストされたキーを見つけよう

私は 'Gmt'を含むすべてのキーを見つけようとしており、対応するエポック値を瞬時にフォーマットしています。

var myObject = { 
    "suffix" : "mr", 
    "fname" : "jullian", 
    "lname" : "exor", 
    "dobGmt" : 145754294700000 
    "addressLine1" : "flat 8a", 
    "street" : "hoxley close", 
    "rentStartedGmt" : 145754294700000, 
    "deposit" : "50.00", 
    "occupation" : "math teacher", 
    "profession" : { 
     "careerStartedGmt": 1458755224800000, 
     "careerEndGmt": 1459854224800000, 
    }, 
    "salary" : 28000, 
    "votingDetail" : { 
     "location" : "virgina", 
     "votedOnGmt": 1874585224800000, 
     "votedFor" : "world wildlife foundation" 
    } 
} 

私はしかし、私は、lodash使用していますprofession.careerStartedGmtprofession.careerEndGmtvotingDetail.votedOnGmt

var myObjectClone = _.clone(myObject); 

for (var key in myObjectClone) { 
    if (key.indexOf("Gmt") !== -1) { 

     var timeValue = myObjectClone[key]; 

     timeValue = timeValue.format('DD-MM-YY HH:mm:ss'); 

    } 
} 

を欠場するrentStartedGmtを見つけます(下記参照)上記のキー、をループに標準JSを使用することができますがありそこに任意の私は 'Gmt'を含むすべてのキーを見つけることができます、エポックを変更し、オブジェクトのクローンを返します。


更新:再帰を使用:

function findGmt(data) { 
    for (var key in data) { 
     var v = data[key]; 
     if (key.indexOf("Gmt") !== -1) { 


     } 

     if(v && typeof v === "object") { 
      findGmt(v); 
     } 
    } 
} 

findGmt(myObjectClone); 
+2

再帰が必要です。再帰をサポートするlodashメソッドはありません。だからあなた自身の再帰関数を書く必要があります。 – hindmost

+0

@hindmost - ああ、私の助言に感謝します。再帰的な試みで更新しました。 –

答えて

1

が、ここでは、バニラJSで再帰関数だ...このためlodash具体的な方法を知ってはいけない:

var obj = { 
 
    "suffix": "mr", 
 
    "fname": "jullian", 
 
    "lname": "exor", 
 
    "dobGmt": 145754294700000, 
 
    "addressLine1": "flat 8a", 
 
    "street": "hoxley close", 
 
    "rentStartedGmt": 145754294700000, 
 
    "deposit": "50.00", 
 
    "occupation": "math teacher", 
 
    "profession": { 
 
    "careerStartedGmt": 1458755224800000, 
 
    "careerEndGmt": 1459854224800000, 
 
    }, 
 
    "salary": 28000, 
 
    "votingDetail": { 
 
    "location": "virgina", 
 
    "votedOnGmt": 1874585224800000, 
 
    "votedFor": "world wildlife foundation" 
 
    } 
 
} 
 

 

 
function flatK(o) { 
 
    return Object.keys(o).reduce(function(ac, x) { 
 
    if (typeof o[x] === 'object') 
 
     ac.push(flatK(o[x]).join()); 
 
    else 
 
     ac.push(x); 
 
    return ac 
 
    }, []) 
 
} 
 

 
console.log(flatK(obj))

キーで 'GMT'を探して出力をフィルタリングすることができます(ただし、これを実行させます)。

+0

これはありがとう!これは私の更新された再帰的な試みよりも優れている/より効率的ですか? –

+0

あなたの関数が何も返さなくても、私はループしている間にフィルタリングの試みを見ることができます...通常、関数をできるだけ中立に保って再利用できるようにしたいが、これは状況に依存する。 – maioman

関連する問題