JS разделить массив, чтобы создать подмассивы и найти объединенный набор всех массивов - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть данные в следующем формате:

Элемент 1: «Европа> Германия> Берлин> Главный офис» (Объект)

Элемент 2: «Америка> Объединенная Штаты> Штаб-квартира "(Объект)

Элемент 3:" Америка> Соединенные Штаты> Нью-Йорк> Главный офис "(Объект)

Элемент 4:" Америка> Соединенные Штаты> Нью-Йорк> Дополнительное отделение " (Объект)

Элемент 5: «Великобритания> Англия> Лондон> Главный офис» (Объект)

Сначала я пытаюсь разбить массив на основе символа «>» и создайте дерево всех элементов в следующем формате (vanilla 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)) для нахождения объединения всех массивов, но без кубиков!

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете использовать рекурсивную функцию для каждой строки в массиве, чтобы создать вложенные объекты.

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('>'))  });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...