示例:由原對象{a: {test: 1, b: 2}} 根據a.b.c.d這樣的包名轉換爲:{"a":{"test":1,"b":{"c":{"d":{}}}}}
說明:包名有"."分隔,本身代表着層級結構,而json對象本身也是由屬性和值構成的,允許嵌套,因此現在就有一個需求,把包的描述字符串,轉換成json類型,條件是要注意到已經存在的其他屬性.本例中屬性a的值是對象,因此要保留該,只對其內容做擴展,而屬性b的值不是對象類型,因此要用對象覆蓋掉,其他不存在的屬性,要付給空對象.
本例使用遞歸實現:
function namespace(oNamespace, sPackage) {
var obj = oNamespace;
var pkg = "";
if(sPackage.indexOf(".")==-1){
pkg = sPackage;
}else{
pkg = sPackage.substr(0,1);
}
if(pkg&&!(obj[pkg]&&obj[pkg] instanceof Object)){
obj[pkg] = {};
}
if(sPackage.indexOf(".")!=-1){
namespace(obj[pkg],sPackage.substr(2));
}
return obj;
}
測試代碼:
var obj = namespace({a: {test: 1, b: 2}}, 'a.b.c.d');
console.log(JSON.stringify(obj));
結果:
{"a":{"test":1,"b":{"c":{"d":{}}}}}
功能是做出來了,但不用遞歸是不是也能實現呢?我現在腦子亂,不想做了,請讀者思考?