Я хочу получить иерархию из массива - Angular 8 - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть массив и одно строковое значение. Я хочу получить иерархию строк в массиве.

Например, у меня есть строковое значение "Casuals". Значение «Casuals» находится внутри объекта «Shirts». Значение "Рубашки" находится внутри объекта "Мужчины". И значение «Мужчины» находится внутри объекта «Категория по умолчанию». Итак, вот как должна работать логика c.

Вот мой образец массива:

{
  "id": 2,
  "name": "Default Category",
  "children_data": [
    {
      "id": 3,
      "name": "Men",
      "children_data": [
        {
          "id": 11,
          "name": "T-Shirts",
          "children_data": [
            {
              "id": 27,
              "name": "Polos"
            },
            {
              "id": 28,
              "name": "Tees"
            }
          ]
        },
        {
          "id": 12,
          "name": "Shirts",
          "children_data": [
            {
              "id": 30,
              "name": "Casuals"
            },
            {
              "id": 31,
              "name": "Formals"
            }
          ]
        }
      ]
    },
    {
      "id": 4,
      "name": "Women",
      "children_data": [
        {
          "id": 80,
          "name": "Western wears",
          "children_data": [
            {
              "id": 81,
              "name": "T-Shirts"
            },
            {
              "id": 82,
              "name": "Tank & Crop Tops"
            }
          ]
        },
        {
          "id": 21,
          "name": "Ethnic wears",
          "children_data": [
            {
              "id": 51,
              "name": "Kurta & Kurtis"
            },
            {
              "id": 52,
              "name": "Kurta Sets"
            }
          ]
       }
      ]
    }
  ]
}

И у меня есть значение

let myCategory = " Casuals ";

Итак, я хочу получить окончательное значение ["Категория по умолчанию", "Мужчины", "Рубашки", " Casuals"]

Я все еще пытаюсь получить Иерархию значения.

Ответы [ 2 ]

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

Необходимо использовать Depth First Search Algorithm для рекурсивного поиска более высокого объекта, а затем использовать рекурсивный подход для поиска всех родителей:

// Depth First Search Algorithm
function getParentNodeByChild(obj, nameToFind) {
    if (obj.children_data) {
       if (obj.children_data.some(ch => ch.name == nameToFind))
           return obj;
       else {
           for (let item of obj.children_data) {
               if (item.children_data) {
                   let check = this.getParentNodeByChild(item, nameToFind)
                   if (check) {
                       return check;
                   }
               }
           }
       }
    }
    return null
}


function getParentObject(nameToFind) {
    let parentObj;
    if (obj.children_data && obj.children_data.some(ch => ch.name == nameToFind))
        return obj;
    else {
        for (let i = 0; i < obj.children_data.length; ++i) {
            parentObj = getParentNodeByChild(obj.children_data[i], nameToFind);
            if (parentObj)
                break;
        }
        return parentObj;
    }
 }

const getAllNames = keyName => {
    const parentObject = getParentObject(keyName);
    if (parentObject != null && parentObject.name != null) {
        names.push(parentObject.name)
        getAllNames(parentObject.name);
    }
}

let names = [];
let keyToFind = 'Casuals';
getAllNames(keyToFind);
names.push(keyToFind);
console.log(`names`, names);

Пример:

let obj = {
  "id": 2,
  "name": "Default Category",
  "children_data": [
{
  "id": 3,
  "name": "Men",
  "children_data": [
    {
      "id": 11,
      "name": "T-Shirts",
      "children_data": [
        {
          "id": 27,
          "name": "Polos"
        },
        {
          "id": 28,
          "name": "Tees"
        }
      ]
    },
    {
      "id": 12,
      "name": "Shirts",
      "children_data": [
        {
          "id": 30,
          "name": "Casuals"
        },
        {
          "id": 31,
          "name": "Formals"
        }
      ]
    }
  ]
},
{
  "id": 4,
  "name": "Women",
  "children_data": [
    {
      "id": 80,
      "name": "Western wears",
      "children_data": [
        {
          "id": 81,
          "name": "T-Shirts"
        },
        {
          "id": 82,
          "name": "Tank & Crop Tops"
        }
      ]
    },
    {
      "id": 21,
      "name": "Ethnic wears",
      "children_data": [
        {
          "id": 51,
          "name": "Kurta & Kurtis"
        },
        {
          "id": 52,
          "name": "Kurta Sets"
        }
      ]
   }
  ]
}
  ]
};


// Depth First Search Algorithm
function getParentNodeByChild(obj, nameToFind) {
  if (obj.children_data) {
  if (obj.children_data.some(ch => ch.name == nameToFind))
      return obj;
  else {
      for (let item of obj.children_data) {
          if (item.children_data) {
              let check = this.getParentNodeByChild(item, nameToFind)
              if (check) {
                  return check;
              }
          }
      }
  }
  }
  return null
}


function getParentObject(nameToFind) {
  let parentObj;
  if (obj.children_data && obj.children_data.some(ch => ch.name == nameToFind))
return obj;
  else {
  for (let i = 0; i < obj.children_data.length; ++i) {
      parentObj = getParentNodeByChild(obj.children_data[i], nameToFind);
      if (parentObj)
          break;
  }
  return parentObj;
  }
}


const getAllNames = keyName => {
const parentObject = getParentObject(keyName);
if (parentObject != null && parentObject.name != null) {
  names.push(parentObject.name)
  getAllNames(parentObject.name);
}
}

let names = [];
let keyToFind = 'Casuals';
getAllNames(keyToFind);
names.push(keyToFind);
console.log(`names`, names);
0 голосов
/ 06 февраля 2020

Пожалуйста, попробуйте следующий код для вашей проблемы. Дайте мне знать, если вы столкнулись с какой-либо проблемой. Пожалуйста, смотрите рабочий демо .

Звоните getFilterdObject(data,'Polos'), data ваш объект.

function getFilterdObject(obj,param){
  let finalArray =[];  
  finalArray.push(obj.name);  
  if(obj['name'] != param && obj['children_data']){
    let filterData = obj['children_data'].filter(function search(a) {
        var children;
        if (a.name === param) {
            return true;
        }
        if (!Array.isArray(a.children_data)) {
            return false;
        }
        children = a.children_data.filter(search);
        if (children.length) {
            a.children_data = children;
            return true; 
        } 
    });
    if(filterData.length){
      getArray(filterData, param);
    }
    else{
      finalArray =[];
    }
  }

  function getArray(obj,param){
    if(obj.length){     
      obj.map((val)=>{  
        finalArray.push(val.name);
        if(val.children_data && val.name != param){
          getArray(val.children_data, param);  
        }
      }); 
    }  
 }
   return finalArray;
}; 
...