建立一个帮助函数,该函数读取可变数量的参数或参数数组。
Object.prototype.$ = function() {
var result = this;
var list;
/*
Array .$(["first", "text"])
String .$("second.number")
String Parameters .$("first", "text")
*/
if(arguments.length == 1 && Object.prototype.toString.call(arguments[0]) === "[object Array]")
list = arguments[0];
else if(arguments.length == 1 && typeof(arguments[0]) == 'string' && arguments[0].indexOf(".") >= 0)
list = arguments[0].split(".");
else
list = arguments;
for(var i=0; i<list.length; i++)
result = result[list[i]];
return result;
}
// test it
data =
{
'first': {
'number': 1,
'text': 'Ya.'
},
'second': {
'number': 10,
'text': 'Da.'
}
};
var s = "second";
var s2 = "first.number";
console.log(data.$("first", "text"));
console.log(data.$(s, "number"));
console.log(data.$(["first", "number"]));
console.log(data.$(s2));
编辑你也可以做一个辅助函数进行非规范化的对象,但你非规范化之后,因为编辑的值会导致冲突,因为你的对象有内部对象的值复制只读值。
实施例:
data["first"]["number"] == data["first.number"];
data["first.number"] = -1;
data["first"]["number"] != data["first.number"];
反规范化代码
function denormalize(obj, lv) {
var more = false;
for(var k in obj) {
if(k.split(".").length == lv) {
var node = obj[k]
if(node && typeof(node) == 'object') {
more = true;
for(var k2 in node) {
obj[k + "." + k2] = node[k2];
}
}
}
}
if(more)
denormalize(obj, lv + 1);
return obj;
}
// test it
data =
{
'first': {
'number': 1,
'text': 'Ya.'
},
'second': {
'number': 10,
'text': 'Da.'
},
"third": [{"number": 5, "text": "meh"},{"number": 6, "text": "beh"}]
};
denormalize(data, 1);
for(var k in data)
console.log(k + " : " + data[k]);
是什么毛病'数据[成员名称]将[PropertyName]'??? – mohkhan
或data.memberName.propertyName? – Stefan
如果你的路径没有非罗嗦的字符,你可以评估路径。你也可以使用[] .map()或者在展开路径上的循环来逐步深入一步,设置分支到根目录并继续... – dandavis