我们需要编写一个JavaScript函数,该函数接受一个字符串数组并返回一个与字符串对应的对象。
例如-
如果数组是-
const arr = [ "country.UK.level.1", "country.UK.level.2", "country.US.level.1", "country.UK.level.3" ];
那么输出应该是-
const output = { "country": [ {"UK" : {"level" : ["1", "2", "3"]}}, {"US" : {"level" : ["1","2"]}} ] }
存储在str数组中的字符串将不会排序,并且代码应对此健壮。
字符串将遵循xyxy ..模式,其中x对于该数组是唯一的,而y可以更改。在我的示例中,国家和级别将始终与表示x pos的相同。
这需要递归方法,因为存储在str数组中的字符串可以是任意长度。字符串越长,嵌套越深。
以下是代码-
const arr = [ "country.UK.level.1", "country.UK.level.2", "country.US.level.1", "country.UK.level.3" ]; const stringToObject = arr => { const obj = {}; arr.forEach(str => { let curr = obj; let splitted = str.split('.'); let last = splitted.pop(); let beforeLast = splitted.pop(); splitted.forEach( sub => { if(!curr.hasOwnProperty(sub)){ curr[sub] = {}; }; curr = curr[sub]; }); if(!curr[beforeLast]){ curr[beforeLast] = []; }; curr[beforeLast].push(last); }); return obj; }; console.log(JSON.stringify(stringToObject(arr), undefined, 4));
输出结果
这将在控制台上产生以下输出-
{ "country": { "UK": { "level": [ "1", "2", "3" ] }, "US": { "level": [ "1" ] } } }