我正在使用JSON验证程序,该验证程序根据架构检查给定的JSON对象,如果它不匹配则返回错误。我需要做的一件事是添加缺少的属性,但这些可能在结构中非常深。验证器错误以这种格式将缺少的属性的位置返回为字符串:
'data.thing1.thing2.thingN'
我可以删除"数据。"有点容易,但我不知道如何将其余部分翻译成正确的对象符号,无论如何。这是我到目前为止所得到的:
var attributeLineage = newField.split(".");
obj[attributeLineage[0]][attributeLineage[1]] = "";
所以显然这仅在只有两个深度级别时才有效。我需要循环遍历attributeLineage
中的值并将它们全部链接在一起,以在任何深度正确构造给定对象中的缺失属性。怎么办呢?
我可能会遗漏一些完全明显的东西,或者说错误的方式,但我不确定如何继续。
答案 0 :(得分:1)
使用 reduce()
方法获取内部对象的引用,并使用split数组中的last元素更新属性。
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);