Skip to content

Instantly share code, notes, and snippets.

@sakura-crowd
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sakura-crowd/8e9a924f3090183b6a41 to your computer and use it in GitHub Desktop.
Save sakura-crowd/8e9a924f3090183b6a41 to your computer and use it in GitHub Desktop.
describe('sakuraCrowd.jsonId.refToObj', function() {
it("参照オブジェクトを参照先オブジェクトに変換する", function() {
var target = [
{"id":"id1", "value":10},
{"$ref":"id1"}
];
sakuraCrowd.jsonId.refToObj(target);
expect(target.length).toEqual(2);
expect(target[0]).toBe(target[1]);
});
it("循環参照を検出したら該当する JsonPath を返して警告する", function() {
var target = [
{"id":"id1", "value":10, "other":{"$ref":"id2"}},
{"id":"id2", "other":{"$ref":"id1"}}
];
var path = "$[0].other.other";
expect(sakuraCrowd.jsonId.refToObj.bind(null, target)).toThrow("循環参照です。" + path);
});
});
describe('sakuraCrowd.jsonId.objToRef', function() {
it("参照可能オブジェクトを参照オブジェクトに変換する(infoあり)", function() {
var target = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var target2 = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var expectedInfo = {
"root":target,
"table":{
"id1":"$[1]"
}
};
info = sakuraCrowd.jsonId.refToObj(target);
sakuraCrowd.jsonId.objToRef(target, info);
expect(target).toEqual(target2);
expect(info.table).toEqual(expectedInfo.table);
expect(info.root).toBe(expectedInfo.root);
});
it("参照可能オブジェクトを参照オブジェクトに変換する(infoなし)", function() {
// 参照オブジェクトにするときに、 ID に対応した JSONPath の情報がなければ、
// 最初に見つけた参照可能オブジェクトを定義として残します。それ以降は、参照オブジェクトに置換します。
var target = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var target2 = [
{"id":"id1", "value":10},
{"$ref":"id1"}
];
info = sakuraCrowd.jsonId.refToObj(target);
sakuraCrowd.jsonId.objToRef(target);
expect(target).toEqual(target2);
});
});
@sakura-crowd
Copy link
Author

先日は、参照を実際のオブジェクトに置き換えるだけでした。
今回はさらに、 ID を持つオブジェクトが2回以上出た場合に参照に置き換える機能を追加しました。
参照から実際のオブジェクトに置き換えるときに、どこが実際のオブジェクトの定義なのかを記録することで、
あとでオブジェクトから参照に戻すときに、オブジェクトを定義する場所を再現することもできます。
この情報がない場合は、最初に見つけたオブジェクトの場所に定義をして、他はその参照に置き換えます。
この情報は、 refToObj の引数の target の値を root として持ちます。
ID プロパティを持つオブジェクトの target をルートとした JSONPath の絶対パスを ID をキーとして持ちます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment