2016-05-31 64 views
2

我正在使用JSON验证程序,该验证程序根据模式检查给定的JSON对象,并在它不匹配时返回错误。我需要做的一件事是添加缺少的属性,但这些可能在结构中相当深。验证程序错误将以下格式的字符串返回缺少属性的位置:如何将字符串转换为对象表示法

'data.thing1.thing2.thingN' 

我可以去掉“数据”。有点容易,但我不知道如何将其余部分转换为正确的对象表示法,无论深度如何。这是我到目前为止:

var attributeLineage = newField.split("."); 
obj[attributeLineage[0]][attributeLineage[1]] = ""; 

所以显然这只适用于只有两个级别的深度。我需要循环访问attributeLineage中的值,并将它们全部链接在一起,以正确构建给定对象中的缺失属性,并在任何深度。如何才能做到这一点?

我可能会错过某些完全明显的东西,或者以错误的方式去做,但我不知道如何继续。

回答

1

使用reduce()方法获取内部对象的引用并使用拆分数组中的最后一个元素更新属性。

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);

+0

我有点通过这种方法难住了(尽管它比联更有帮助“复制”的答案)。我以为你是在创造ob作为测试,但我不认为你在做什么?我有一个现有的对象,其中缺少的属性需要追加。当我尝试你的方法时,o [k]通常是未定义的,并且obj总是未定义。 我认为这个问题是我需要追加一个属性,而不仅仅是为现有属性填充一个值。 –

+0

@KatharineOsborne:检查更新的那个 –

+0

很酷!我不得不将reduce的返回值更改为:return o [k] || (o [k] =“”)&& o[k];,因为结束属性从来就不是对象本身,并且保留下来:obj [prop] =“”; –