2015-02-11 68 views
1

我有一個數據結構是這樣的:拼合分層數據

{ 
    name: 'test', 
    config: { ... }, 
    prev: { 
     name: 'test1.1', 
     config: { ... }, 
     prev: { 
      name: 'test1.1.1', 
      config: { ... }, 
      prev: { 
       name: 'test1.1.1.1', 
       config: { ... }, 
       prev: undefined 
      } 
     } 
    } 
} 

該結構可以包含「分組」對象內的任何數量的遞歸但相同的結構。

我想提取每個孩子的'name'屬性。我怎樣才能拉平這個用下劃線產生像這樣一個結果:

['test', 'test1.1', 'test1.1.1', 'test1.1.1.1'] 

這將是更大的,如果平坦化過程可能會返回類似

[ 
    {name: 'test', config: { ... }}, 
    {name: 'test1.1', config: { ... }}, 
    {name: 'test1.1.1', config: { ... }}, 
    {name: 'test1.1.1.1', config: { ... }} 
] 

我目前的解決辦法是這樣的(這是不,最佳我想用一個_.chain產生這種):

var _self = { 
    flatten: function (obj) { 
     var map = []; 
     return _self.flattenRecurse(obj, map); 
    }, 
    flattenRecurse: function (obj, map) { 
     map.push({name: obj.name, config: obj.config}); 
     if (obj.prev) { 
      _self.flattenRecurse(obj.prev, map); 
     } 
    } 
} 
var flattened = _self.flatten(data); 

回答

3

更容易使用純JS,這樣

function flatten (data) { 
    var result = []; 

    while (data) { 
    result.push({name: data.name, config: data.config}); 
    data = data.prev; 
    } 

    return result; 
} 

// get full object 
flatten(data) 

// get only names 
var res = flatten(data).map(function (el) { 
    return el.name; 
}); 

Example

+0

這實際上是相當小。不要以爲我可以用下劃線來保存任何代碼行......謝謝。歡迎來到我們的網站: – 2015-02-11 12:13:44

+0

@ØysteinAmundsen;)。 – 2015-02-11 12:14:41

1

遞歸戰略

var data = { 
 
    name: 'test', 
 
    config: { }, 
 
    prev: { 
 
     name: 'test1.1', 
 
     config: { }, 
 
     prev: { 
 
      name: 'test1.1.1', 
 
      config: { }, 
 
      prev: { 
 
       name: 'test1.1.1.1', 
 
       config: { }, 
 
       prev: undefined 
 
      } 
 
     } 
 
    } 
 
}; 
 

 
var reduced = flatten(data, function(item) { 
 
    return { name: item.name, config: item.config }; 
 
}); 
 

 
print(reduced.map(function(item) { return item.name }).join(', ')); 
 
    
 
function flatten(data, reducerFn, result) { 
 
    result = result || []; 
 
    if (data === undefined) return result; 
 
    return flatten(data.prev, reducerFn, result.concat([reducerFn(data)])); 
 
} 
 

 
/* For Display Purposes Only */function print(str) { 
 
    document.getElementById('display').innerHTML += str + '<br />'; 
 
}
<div id="display"></div>