Как объединить значение массива с идентичным объектом id в angular6? - PullRequest
0 голосов
/ 21 мая 2019

Здесь я получаю ответ от моего углового проекта

const testArray = [
{PackageID: 7, FormsList: [{Form_Name: "string One"}]}
{PackageID: 7, FormsList: [{Form_Name: "string Two"}]}
{PackageID: 7, FormsList: [{Form_Name: "string Three"}]}

{PackageID: 11, FormsList: [{Form_Name: "string One"}]}
{PackageID: 11, FormsList: [{Form_Name: "string One"}]}
{PackageID: 11, FormsList: [{Form_Name: "string One"}]}]

После получения этого массива я хочу объединить его с массивом FormsList с таким же идентификатором, как показано ниже

const testArray = [
{PackageID: 7, FormsList: [{Form_Name: "string One"}, {Form_Name: "string Two"}, {Form_Name: "string Three"}]}  
{PackageID: 11, FormsList:  [{Form_Name: "string One"}, {Form_Name: "string Two"}, {Form_Name: "string Three"}]}]

иПосле объединения, как удалить конкретный объект FormList> Form_Name, выделенный.

Например, я получаю удаленное значение, подобное этому

const deleteArray = [{PackageID: 7, FormsList: [{Form_Name: "string Two"}]}]

Результат массива теста без второго объекта, как показано ниже кода

const testArray = [{PackageID: 7, FormsList: [{Form_Name: "string One"}, {Form_Name: "string Three"}]}, {PackageID: 11, FormsList:  [{Form_Name: "string One"}, {Form_Name: "string Two"}, {Form_Name: "string Three"}]}]

Пожалуйста, помогите в этом.

скриншот обновления enter image description here

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Итак, начнем!Первое, что мы должны сделать, это создать список PackageID's

const ids = testArray.map(item => item.PackageID)

, а затем давайте получим уникальные значения из этого массива.Для этого нам нужно сделать в два шага

  1. Создать функцию distinct
const distinct = (value, index, self) => {
    return self.indexOf(value) === index
}
Создать список уникальных идентификаторов
const uniqIds = ids.filter(distinct)

Теперь мы можем объединить testArray

const res = uniqIds.map(id => {
    let tmp = []
    const arr = testArray.filter(item => item.PackageID === id)

    arr.forEach(item => {
        tmp.push(...item.FormsList)
    })

    return { PackageID: id, FormsList: tmp }
})

Надеюсь, это поможет вам

1 голос
/ 21 мая 2019

Слияние, Примечание: используйте let вместо const

let tempArr : {
  PackageId : number,
  FormsList : {
    Form_Name : string
  }[]
}[] = []

// Iterate over test array
for(let testItem of testArray){
    // Check if item id exist
    if(tempArr.find(i=>i.PackageId==testItem.PackageID)){
        // Itearte over form list
        for(let testItemForm of testItem.FormsList){
      tempArr.find(i=>i.PackageId==testItem.PackageID).FormsList.push(testItemForm)
        }
    }else{
        tempArr.push({
            PackageId : testItem.PackageID,
            FormsList : testItem.FormsList
        })
    }
}

// Copy back
testArray = tempArr

Удаление,

// Iterate over test array
for(let testItem of testArray){
    // Itearte over delete array
    for(let deleteItem of deleteArray){
        // Check if id matches  
        if(testItem.PackageID == deleteItem.PackageID){
            // Itearte over delete form list
            for(let deleteItemForm of deleteItem.FormsList){
                // Filter form list of test item
                testItem.FormsList = testItem.FormsList.filter(f=>f.Form_Name!=deleteItemForm.Form_Name)
            }
        }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...