2016-05-31 10 views
2

JSONオブジェクトをスキーマに対してチェックし、一致しない場合はエラーを返すJSONバリデータを使用しています。私がしなければならないことの一つは欠落している属性を追加することですが、これらは潜在的に構造が深刻な可能性があります。バリデータのエラーは、この形式の文字列として不足している属性の位置を返します:「データ」文字列をオブジェクト表記に変換する方法

'data.thing1.thing2.thingN' 

私は取り除くことができます少しでも簡単にはできますが、残りの部分をどのように深く変換してオブジェクトの表記を修正するかはわかりません。これは私が今までに持っているものです:

var attributeLineage = newField.split("."); 
obj[attributeLineage[0]][attributeLineage[1]] = ""; 

明らかにこれは、2つのレベルの深さしかない場合にのみ機能します。私はattributeLineageの値をループし、それらをすべてリンクして、指定されたオブジェクトの不足している属性を正しく構築する必要があります。これはどうすればできますか?

私は何かが完全に明白でないか、間違った方法で行こうとしているかもしれませんが、どのように進めるかは分かりません。

答えて

1

reduce()メソッドは、内部オブジェクトの参照を取得し、分割配列の最後の要素を使用してプロパティを更新します。

var newField = 'data.thing1.thing2.thingN'; 
 
// split the string 
 
var attributeLineage = newField.split("."), 
 
    // get last element and remove it from splitted array 
 
    prop = attributeLineage.pop(); 
 

 
var ob = { 
 
    data: {} 
 
}; 
 

 
// get the object reference 
 
var obj = attributeLineage.reduce(function(o, k) { 
 
    // return if nested object is defined 
 
    // else define and return it 
 
    return o[k] || (o[k] = {}) && o[k]; 
 
}, ob); 
 

 
// update the inner object property 
 
obj[prop] = "hi"; 
 

 
console.log(ob);

+0

私は(それがリンクさよりも便利だけれども答えは「複製」)は、このアプローチによって困惑ビットです。私はあなたがテストとしてOBを作成していると思ったが、それはあなたがやっていることだとは思わない?不足している属性を追加する必要がある既存のオブジェクトがあります。私があなたのアプローチを試みるとき、o [k]はしばしば未定義であり、objは常に未定義に終わります。 私は、既存の属性に値を入力するのではなく、属性を追加する必要があると思います。 –

+0

@KatharineOsborne:更新されたものを確認してください –

+0

ああクール!私はreduceの返り値を次のように変更しなければならなかった:return o [k] ||終了属性は決してオブジェクト自体ではなく、このビットを残したままであるため、オブジェクト(o [k] = "")&& o[k];が返されます:obj [prop] = ""; –

関連する問題