JS разделя масив, за да направи подмасиви и да намери обединен набор от всички масиви

Имам данни в следния формат:

Елемент 1: „Европа > Германия > Берлин > Главен офис“ (обект)

Елемент 2: „Америка > Съединени щати > щаб” (обект)

Елемент 3: „Америка > Съединени щати > Ню Йорк > Главен офис“ (обект)

Елемент 4: „Америка > Съединени щати > Ню Йорк > Подофис” (обект)

Елемент 5: „Обединено кралство > Англия > Лондон > Главен офис“ (обект)

Първо се опитвам да разделя масива на базата на знака ">" и да създам дърво от всички елементи в следния формат (ванилен js/es6):

"Europe": {
  "Germany": {
    "Berlin": {
      "Main Office": "Object"
    }
  }
},

Моят опит:

Array.prototype.slice.call(elements).forEach((el) => {

    let 
    stringIHave = el.name, // "Europe > Germany > Berlin > Main Office" 
    keywordsArr = stringIHave.split( " > " ),
    arrayTree =  new Array();

    Array.prototype.slice.call(keywordsArr).forEach((subEl) => {
        //arrayTree.push(el.toString()); // Result: {"Europe", "Germany", "Berlin", "Main Office" }  

        // What I'm Seeking:  
        // "Europe": { "Germany": { "Berlin": { "Main Office": "Object" } } },

    });

});

След като форматираме данните, трябва да намерим обединението (или един единствен масив) на всички масиви, както е показано по-долу:

[
"Europe": {
  "Germany": {
    "Berlin": {
      "Main Office": "Object"
    }
  }
},

"America": {
  "United States": {
    "Headquarters",
    "NY": {
      "Main Office": "Object",
      "Sub Office": "Object"
    }
  }
},

"United Kingdom": {
  "England": {
    "London": {
      "Main Office": "Object"
    }
  }
}
]

Опитвам се да използвам Array.from(new Set(masterArray)) за намиране на обединението на всички масиви, но няма зарове!


person Dev01    schedule 14.02.2020    source източник
comment
Значи вашите данни са масив от низове?   -  person Addis    schedule 14.02.2020
comment
@Addis Да, всички низове!   -  person Dev01    schedule 14.02.2020
comment
Добре, но { "Main Office" } не е валиден тип данни, нито е обект. Обектите трябва да са двойки ключ-стойност.   -  person Addis    schedule 14.02.2020
comment
@Addis Вярно! Главният офис, подофисът и централата по-късно ще се свържат с техните относителни обекти. Не исках да усложнявам въпроса и исках да се занимавам с един въпрос наведнъж.   -  person Dev01    schedule 14.02.2020
comment
@Addis току-що актуализира въпроса!   -  person Dev01    schedule 14.02.2020
comment
Имате предвид "Main Office": "Object"?   -  person Addis    schedule 14.02.2020
comment
@Addis Правилно, съжалявам за лошо форматирания въпрос!   -  person Dev01    schedule 14.02.2020
comment
Вижте отговора ми.   -  person Addis    schedule 14.02.2020


Отговори (1)


Можете да използвате рекурсивна функция за всеки низ в масива, за да конструирате вложените обекти.

const data = [
  'Element 1: Europe > Germany > Berlin > Main Office',

  'Element 2: America > United States > Headquarters',

  'Element 3: America > United States > NY > Main Office',

  'Element 4: America > United States > NY > Sub Office',

  'Element 5: United Kingdom > England > London > Main Office'
]
 
 //remove the string before ':' on all array elements.
 let data1 = data.map(str => str.slice( str.indexOf(':') +1, -1 ));
 
 let arrayTree = data1.map(str => convertToTree(str)) ;
 
 console.log(arrayTree);

 function convertToTree(str) {
     let places = str.split('>');
   
     if(places.length === 1) {
         return ({"Main Office": "Object"});
     }
   
     //the first part of the splited string should be the property and the remaining part will be converted 
     //back to string and sent to the recursive function until the result of the split becomes a single element

     return ({ [places[0]]:convertToTree(places.slice(1).join('>'))  });
 }

person Addis    schedule 14.02.2020
comment
Благодаря, но все още не обединява всички масиви и не намира обединения набор! - person Dev01; 15.02.2020