从 .txt 文件 Javascript 创建包含 N' 个嵌套对象的嵌套对象 [英] Create Nested Object which contains N' nested objectsfrom .txt file Javascript

查看:41
本文介绍了从 .txt 文件 Javascript 创建包含 N' 个嵌套对象的嵌套对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过多次尝试和搜索,我决定问,因为我卡住了.我有一个这样的 txt 文件:

After lots of tries and searching I decide to ask because I am stuck.I have a txt file like this:

CITYS
CITYS.AREAS
CITYS.AREAS.STREETS
CITYS.AREAS.STREETS.HOUSES
CITYS.AREAS.STREETS.HOUSES.ROOMS
CITYS.AREAS.STREETS.HOUSES.ROOMS.KITCHEN
CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS
CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TV
CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE
CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE.VASE
CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE.ASTREY
CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS
CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE
CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE.SHAMPOO
CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE.CONTITIONER
CITYS.AREAS.STREETS.HOUSES.GARDEN
CITYS.AREAS.STREETS.HOUSES.GARDEN.POOL
CITYS.AREAS.STREETS.HOUSES.GARDEN.POOL.WATER
CITYS.AREAS.STREETS.HOUSES.GARDEN.TREE.....
CITYS.AREAS.STREETS.CARS
CITYS.AREAS.STREETS.CARS.BRAND...
CITYS.AREAS.STREETS.CARS.BRAND.LOGO.....
CITYS.AREAS.STREETS.CARS.COLOR..
CITYS.AREAS.STREETS.CARS.TYPE..

<小时>我想把它转换成这样的嵌套对象


And I want to convert it into a nested object like this

    CITYS:{
    AREAS:{
        STREETS:{
          HOUSES:{
           ROOMS: {        
                LIVINGROOMS: {TV,TABLE:{VASE,ASTREY}},
                BATHROOMS:  {BATHTUBE:{SHAMPOO,CONTITIONER},MIRROR},                    
                ...
            },              
            GARDEN:{
                    ......              
            },
          },             
         CARS:{              
            BRAND:{LOGO},
            COLOR:{},
            TYPE:{},                
            ......
            },              
        },
    }   
}

<小时>我正在做类似的事情(IN ARRAY)


I am tring to do somthing like that (IN ARRAY)

for(var line = 0; line < lines.length; line++){

    var n = lines[line];
    var ninpieces = n.split(".");
    var name=ninpieces[ninpieces.length-1];
    var nametostore=ninpieces[ninpieces.length-2]   ;

      CreateObject(name,nametostore);
};

CreateObject=function(name,nametostore){

this.a= name;
this.b= nametostore;

newpar=this['b'];
newchild=this['a'];
this[newchild]=new Array();


if (typeof this[newpar] != "object") {
this[newpar]=new Array();
}

this[newchild].push(name);
this[newpar].push(this[newchild])
stractureobj.push(this[newpar])
} 

是我在 stackoverflow 中找到的一些东西的组合,但它不起作用.

Is a combination of things that I found here in stackoverflow but it's not working.

推荐答案

您可以使用以下代码.这个算法"还通过完全点的名称临时存储属性,作为相应嵌套对象的同义词.这样它可以快速检索到在哪里注入下一行的对象.

You can use the following code. This "algorithm" temporarily stores also properties by their fully dotted names, as synonyms for the corresponding nested objects. This way it can quickly retrieve where to inject the next line's object.

请注意,如果输入已排序,则算法执行速度最快.如有必要,您可以使用 lines.sort() 执行此操作.

Note that the algorithm performs fastest if the input is sorted. This you can do with lines.sort() if necessary.

function addNestedObject(obj, lines) {
    var map = { '': obj }; // Set starting point for empty path
    function addLine(line) {
        var name = line.split(".").pop();
        var path = line.substr(0, line.length-name.length-1);
        if (!map[path]) addLine(path); // recurse to create parent
        if (!map[line]) map[line] = map[path][name] = {}; // set name & line synonym
    }
    // Process each line with above private function.
    for (var line of lines.slice().sort()) addLine(line);
    return obj; // Might be useful to have as return value as well 
};

// Sample input
var lines = [
    'CITYS.AREAS',
    'CITYS.AREAS.STREETS',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TV',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE.VASE',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.LIVINGROOMS.TABLE.ASTREY',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE.SHAMPOO',
    'CITYS.AREAS.STREETS.HOUSES.ROOMS.BATHROOMS.BATHTUBE.CONTITIONER',
    'CITYS.AREAS.STREETS.HOUSES.GARDEN',
    'CITYS.AREAS.STREETS.HOUSES.GARDEN.POOL',
    'CITYS.AREAS.STREETS.HOUSES.GARDEN.POOL.WATER',
    'CITYS',
];

var stractureobj = { 'otherProperty': 42 };

// Convert lines to nested object and add to stractureobj
addNestedObject(stractureobj, lines);

// Output in snippet
document.querySelector('pre').textContent=JSON.stringify(stractureobj, null, 4);

<pre></pre>

上面使用了一个对象stractureobj,它已经有自己的属性,必须添加嵌套结构.

The above uses an object stractureobj, with already its own properties, to which the nested structure must be added.

如果你只对一个只有嵌套结构的对象感兴趣,没有别的,你可以用空对象调用它并分配返回值:

If you are only interested to have an object with just the nested structure, and nothing else, you could call it with the empty object and assign the return value:

var stractureobj = addNestedObject({}, lines);

归结为与此相同:

var stractureobj = {};
addNestedObject(stractureobj, lines);

这篇关于从 .txt 文件 Javascript 创建包含 N' 个嵌套对象的嵌套对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆