为了账号安全,请及时绑定邮箱和手机立即绑定

点分隔字符串数组中的树

点分隔字符串数组中的树

慕后森 2022-10-13 16:03:47
我有一个点分隔的字符串数组,如下所示data = [    'Europe.UK.London.TrafalgarSq',     'Europe.UK.London.HydePark',     'Europe.UK.London.OxfordStreet',     'Europe.UK.London.City.Bank',     'Europe.France.Paris',     'Europe.France.Bordeaux'},]我想构建以下嵌套对象树。万一这很重要,这适用于将要使用Tree Layers Controlleaflet的地图var tree = {    label: 'Places',    selectAllCheckbox: 'Un/select all',    children: [        {            label: 'Europe',            selectAllCheckbox: true,            children: [                {                    label: 'Europe.UK',                    selectAllCheckbox: true,                    children: [                        {                            label: 'Europe.UK.London',                            selectAllCheckbox: true,                            children: [                                {label: 'Europe.UK.London.TrafalgarSq'},                                {label: 'Europe.UK.London.HydePark'},                                {label: 'Europe.UK.London.OxfordStreet'},                                {                                    label: 'Europe.UK.London.City',                                    selectAllCheckbox: true,                                    children: [                                        {label: 'Europe.UK.London.City.Bank'},                                    ]                                },                            ]                        },                        {                            label: 'Europe.France',                            selectAllCheckbox: true,                            children: [                                {label: 'Europe.France.Paris'},                                {label: 'Europe.France.Bordeaux'},                            ]                        },                    ]                }            ]        }    ]};请问这棵树怎么做?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您可以使用mapper具有部分路径(或label)的对象作为键,并使用对树中对象的引用作为其值。split路径.和reduce数组tree作为initialValue。如果path尚不存在,请将其添加到映射器和树中。在每次迭代中返回嵌套对象。


const data = ["Europe.UK.London.TrafalgarSq","Europe.UK.London.HydePark","Europe.UK.London.OxfordStreet","Europe.UK.London.City.Bank","Europe.France.Paris","Europe.France.Bordeaux"],

    mapper = {},

    tree = {

      label: 'Places',

      selectAllCheckbox: 'Un/select all',

      children: []

    }


for (const str of data) {

  let splits = str.split('.'),

      label = '';


  splits.reduce((parent, place) => {

    if (label)

      label += `.${place}`

    else

      label = place


    if (!mapper[label]) {

      const o = { label };

      mapper[label] = o;

      parent.selectAllCheckbox = true

      parent.children = parent.children || [];

      parent.children.push(o)

    }


    return mapper[label];

  }, tree)

}


console.log(tree)


查看完整回答
反对 回复 2022-10-13
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以使用减少嵌套对象的迭代方法。


var data = ['Europe.UK.London.TrafalgarSq', 'Europe.UK.London.HydePark', 'Europe.UK.London.OxfordStreet', 'Europe.UK.London.City.Bank', 'Europe.France.Paris', 'Europe.France.Bordeaux'],

    children = data.reduce((r, s) => {

        s.split('.').reduce((q, _, i, a) => {

            q.selectAllCheckbox = true;

            var label = a.slice(0, i + 1).join('.'),

                temp = (q.children = q.children || []).find(o => o.label === label);

            if (!temp) q.children.push(temp = { label });

            return temp;

        }, r);

        return r;

    }, { children: [] }).children,

    tree = { label: 'Places', selectAllCheckbox: 'Un/select all', children };


console.log(tree);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2022-10-13
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信