es6 объединяет два массива с объектами и накапливает данные - PullRequest
0 голосов
/ 22 января 2019

У меня есть два массива objectcs

const a = [
  {
    "categoryId": 1,
    "categoryName": "category 1",
    "id": 11
  },
  {
    "categoryId": 2,
    "teamName": "category 2",
    "id": 22
  }
]

const b = [
  {
    "categoryId": 2,
    "categoryName": "category 2",
    "id": 33
  },
  {
    "categoryId": 3,
    "categoryName": "category 3",
    "id": 44
  }
]

Теперь я хочу объединить их так, чтобы конечный результат выглядел следующим образом:

const result = [
  {
    "categoryId": 1,
    "categoryName": "category 1",
    "aId": 11,
    "bId" null: 
  },
  {
    "categoryId": 2,
    "categoryName": "category 2",
    "aId": 22,
    "bId" 33:
  },
  {
    "categoryId": 3,
    "categoryName": "category 3",
    "aId": null,
    "bId" 44:
  }
]

Я не вижу, как я могу присвоить нулевые значения.

Я уже пробовал это с Object.assign и с оператором "...", но не получил желаемый результат.

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

let result = a.concat (b) даст мне неверный результат

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы можете использовать Set, чтобы получить только уникальные идентификаторы, затем вы можете отобразить их, найти соответствующие данные и построить объект в требуемом формате:

const admin = [{
    "categoryId": 66,
    "categoryName": "category 66",
    "id": 204
  },
  {
    "categoryId": 149,
    "teamName": "category 149",
    "id": 178
  }
]

const member = [{
    "categoryId": 66,
    "teamName": "category 66",
    "id": 271
  },
  {
    "categoryId": 68,
    "teamName": "category 68",
    "id": 264
  }
]

const findCategory = (categories, category) => categories
  .find(x => x.categoryId === category) || null;

const mergeCategories = (adminIn, memberIn) => {
  const mergedCategories = [
    ...adminIn,
    ...memberIn,
  ];
  
  // we would like to know just the unique id's
  const categoryIds = [...new Set(mergedCategories.map(x => x.categoryId))];
  
  // we can map each unique id
  return categoryIds.map(categoryId => {
  
    // then we can find whether it has a matching category for each
    const adminCategory = findCategory(admin, categoryId);
    const memberCategory = findCategory(member, categoryId);
  
    // now we can use that data to build the object in the required format
    return {
      categoryId,
      categoryName: `category ${categoryId}`,
      adminId: adminCategory === null ? adminCategory : adminCategory.id,
      memberId: memberCategory === null ? memberCategory : memberCategory.id
    }
  });

}

const result = mergeCategories(
  admin,
  member,
)

console.dir(result)
0 голосов
/ 22 января 2019

forEach цикл может быть использован, и мы можем присвоить значения соответственно

const admin = [
    {
      "categoryId": 66,
      "categoryName": "category 66",
      "id": 204
    },
    {
      "categoryId": 149,
      "teamName": "category 149",
      "id": 178
    }
  ]
  
  const member = [
    {
      "categoryId": 66,
      "teamName": "category 66",
      "id": 271
    },
    {
      "categoryId": 68,
      "teamName": "category 68",
      "id": 264
    }
  ]
var arr=[];
  var k=admin.forEach((e)=>{
    var a=e.categoryId;
   if(e.teamName)
   {
e.categoryName=e.teamName;
delete e.teamName;
   }
   if(e.id)
e.adminid=e.id;
else
e.id=null
e.memberId=null;
delete e.id
var t=member.forEach((x)=>{
  if(x.categoryId==a)
  e.memberId=x.id;

})
arr.push(e);
  })
console.log(arr)
0 голосов
/ 22 января 2019

Вы можете использовать contat() для объединения массивов, а затем reduce() для удаления повторяющихся объектов по ключу:

    const admin = [
      {
        "categoryId": 66,
        "categoryName": "category 66",
        "id": 204
      },
      {
        "categoryId": 149,
        "teamName": "category 149",
        "id": 178
      }
    ]

    const member = [
      {
        "categoryId": 66,
        "teamName": "category 66",
        "id": 271
      },
      {
        "categoryId": 68,
        "teamName": "category 68",
        "id": 264
      }
    ];
    
    const client = [
      {
        "categoryId": 66,
        "teamName": "category 66",
        "id": 271
      },
      {
        "categoryId": 155,
        "teamName": "no team",
        "id": 264
      }
    ];
    const merge = function(...params) {
        let mergeResult = [];
        params.map(elem => {mergeResult = mergeResult.concat(elem); });
        return mergeResult;
    }

    const result = Object.values(merge(member, admin, client).reduce((acc,cur)=>Object.assign(acc,{[cur.categoryId]:cur}),{}));

    console.log(result);

Если вам нужно изменить повторяющийся фильтр критерий , просто измените cur.categoryId в функции Object.assign()

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