展平分层数据

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

Ale*_* T. 9

像这样使用普通的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)

  • 这将仅选取第一级节点。 (3认同)