фильтровать и отображать свойство массива объектов на основе различных параметров в angular 5 - PullRequest
2 голосов
/ 27 мая 2020

Я хотел бы достичь следующего путем фильтрации и сопоставления двух массивов вложенных объектов с помощью карты и фильтра в angular.

У меня есть одно решение в отношении моего последнего вопроса для фильтрации на основе указанного свойства c.

манипулировать двумя массивами объектов, создать новый массив и обновить атрибут object1 и добавить в новый массив

, но я не уверен, как фильтровать разные объекты на основе разных свойств.

Я хочу отфильтровать некоторые объекты, используя свойство id, а некоторые - val ... возможно ли это?

  • я хотел бы сравнить type1 и type2 на основе val
  • я хотел бы сравнить объект данных type1 и type2 с помощью dataid
  • я хотел бы сравнить type3 / type4 на основе id ..

const obj1 = [
   {
      "val":"type1",
      "removed":"N",
      "id":1,
      "data":[
         {
            "label":"type1-a",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"N",
            "dataid":26
         }
      ]
   },
   {
      "val":"type2",
      "removed":"N",
      "id":2,
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":128,
      "label":"type4-label2"
   }
]

const obj2 = [
   {
      "val":"type1new",
      "removed":"N",
      "id":1
      "data":[
         {
            "label":"type1new",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-c",
            "removed":null,
            "dataid":null
         },
         {
            "label":"type1-d",
            "removed":null,
            "dataid":null
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type3",
      "removed":null,
      "id":128,
      "label":"new"
   }
]


result = [
   {
      "val":"type1new",
      "removed":"N",
      "id":1,
      "data":[
         {
            "label":"type1new",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"Y",
            "dataid":26
         },
         {
            "label":"type1-c",
            "removed":null,
            "dataid":null
         },
         {
            "label":"type1-d",
            "removed":null,
            "dataid":null
         }
      ]
   },
   {
      "val":"type2",
      "removed":"Y",
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type4",
      "removed":"Y",
      "id":128,
      "label":"type4-label2"
   },
   {
      "val":"type4",
      "removed":null,
      "id":null,
      "label":"type4-label3"
   },
   {
      "val":"type3",
      "removed":null,
      "id":128,
      "label":"new"
   }
]

--- обновленный вопрос выше ---

1 Ответ

2 голосов
/ 27 мая 2020

Вот как бы я с этим справился

const obj1 = [
   {
      "val":"type1",
      "removed":"N",
      "data":[
         {
            "label":"type1-a",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"N",
            "dataid":26
         }
      ]
   },
   {
      "val":"type2",
      "removed":"N",
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":128,
      "label":"type4-label2"
   }
]

const obj2 = [
   {
      "val":"type1",
      "removed":"N",
      "data":[
         {
            "label":"type1-a",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-c",
            "removed":null,
            "dataid":null
         },
         {
            "label":"type1-d",
            "removed":null,
            "dataid":null
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type3",
      "removed":null,
      "id":128,
      "label":"new"
   }
]


const getIdentity = (obj) => {
  if(["type1", "type2"].includes(obj.val)) {
    return obj.val;
  }

  if(["type3", "type4"].includes(obj.val)) {
    return obj.id + obj.val;
  }
}

const result = obj1.reduce((acc, obj) => {

  const similarObj = obj2.find(nobj => getIdentity(nobj) === getIdentity(obj));
  
  if(["type1", "type2"].includes(obj.val) && similarObj) {
    const data = obj.data.reduce((nacc, item) => {
      
      const similarItem = similarObj.data.find(pr => pr.dataid === item.dataid);
      
      if(!similarItem) {

        return [...nacc, {...item, removed: 'Y'}];
      }
      
      const newItem = {
        ...item,
        ...similarItem
      }
      
      return [...nacc, newItem];
    }, similarObj.data.filter(pr => !obj.data.some(npr => pr.dataid === npr.dataid)))
    
    const newObj = {
      ...obj,
      ...similarObj,
      data
    }
    
    return [...acc, newObj];
  }
  
  if(!similarObj) {
    acc = [...acc, {
      ...obj,
      removed: "Y"
    }];
    
    return acc;
  }
  
  return [...acc, obj];

}, obj2.filter(obj => !obj1.some(nobj => getIdentity(obj) === getIdentity(nobj))))

result.sort((prev, next) => prev.val > next.val ? 1 : -1);

console.log(result);

В идеале каждый объект должен содержать свои уникальные id и type, которые определяют, нужна ли дополнительная обработка. Это моя мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...