複雑にネストされた JavaScript オブジェクトがあります。要件は、オブジェクトを完全にフラット化するか、オブジェクト内の一部のメンバーのみをフラット化することです。
var obj = {
a: {
b: {
c: {
d: "Varun"
},
e: "kumar"
}
}
};
期待される結果オブジェクト:
{d: "Varun", e: "kumar"}
{"abcd": "d"} の形式でアクセサ マップを受け取り、オブジェクトを新しいオブジェクトに変換する単純な変換ユーティリティを作成しました。現在、配列はサポートしていません。また、変換ユーティリティは、複雑なオブジェクトをより単純なものに縮小することしかできず、その逆はできません (つまり、単純なメンバーから新しいメンバー オブジェクトを構築します)。
"use strict";
var ObjectUtil = (function () {
// constructor
var cls = function () {
};
// public static
cls.getValueFromAccessor = function (obj, accessor) {
if (obj == null || accessor == null)
return null;
return accessor.split(".").reduce(function(prev, current, index) {
var reducedObject = prev;
if (index == 1)
reducedObject = obj[prev];
if (reducedObject == null)
return null;
return reducedObject[current];
});
};
cls.transform = function(obj, accessorMap, overlay) {
var result;
if (overlay)
result = obj;
else
result = {};
for (var k in accessorMap) {
result[accessorMap[k]] = cls.getValueFromAccessor(obj, k);
}
return result;
};
return cls;
})();
var obj = {
a: {
b: {
c: {
d: "Varun"
},
e: "kumar"
}
}
};
var accessorMap = {
"a.b.c.d": "d",
"a.b.e": "e"
}
ObjectUtil.getValueFromAccessor(obj, "a.b.c.d");
console.log(ObjectUtil.transform(obj, accessorMap, false));
console.log(ObjectUtil.transform(obj, accessorMap, true));
オブジェクトをある形式から別の形式に変換する標準的な方法はありますか? これに利用できるライブラリはありますか?