Øys*_*sen 6 javascript underscore.js
我有这样的数据结构:
{
name: 'test',
config: { ... },
prev: {
name: 'test1.1',
config: { ... },
prev: {
name: 'test1.1.1',
config: { ... },
prev: {
name: 'test1.1.1.1',
config: { ... },
prev: undefined
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该结构可以在'prev'对象中包含任意数量的递归但相同的结构.
我想提取每个孩子的'name'属性.如何使用下划线将其展平以生成结果集,如下所示:
['test', 'test1.1', 'test1.1.1', 'test1.1.1.1']
Run Code Online (Sandbox Code Playgroud)
如果扁平化过程可以返回类似的东西,那就更大了
[
{name: 'test', config: { ... }},
{name: 'test1.1', config: { ... }},
{name: 'test1.1.1', config: { ... }},
{name: 'test1.1.1.1', config: { ... }}
]
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是这个(这不是最优的.我想使用一个_.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);
Run Code Online (Sandbox Code Playgroud)
像这样使用普通的js更容易
const data = {
name: 'test',
config: { },
prev: { name: 'test1.1',
config: { },
prev: {
name: 'test1.1.1',
config: { },
prev: { name: 'test1.1.1.1', config: { }, prev: undefined }
}
}
};
function flatten (data) {
let result = [];
while (data) {
result.push({ name: data.name, config: data.config });
data = data.prev;
}
return result;
}
console.log(flatten(data));
// get only names
const res = flatten(data).map(el => el.name);
console.log(res);Run Code Online (Sandbox Code Playgroud)