【问题标题】:How to merge the array value same id object in angular6?如何在angular6中合并数组值相同的id对象?
【发布时间】:2019-10-07 23:05:09
【问题描述】:

我收到了来自我的 Angular 项目的回复

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"}]}]

得到这个数组后,我想与下面相同 ID 中的 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"}]}]

请帮忙。

更新截图

【问题讨论】:

  • 要明确这与角度无关,后续问题:FormsList 元素是否只有formName 属性?
  • 它还具有其他属性,但我只想发送高于 JSON 字符串化格式的 API 输入。
  • 合并后的删除能解释一下吗?我无法理解你写的东西。您想从testArray 中删除deleteArray 中的项目吗?
  • 当然。请考虑当我选择 FormsList 的复选框(mat-checkbox)值时,我会将值推送到数组中。如果我取消选中该复选框,则希望从更新的数组中删除该值。希望你能理解。
  • @imjayabal 所以你想从 testArray 中删除 deleteArray 中的项目吗?对吗?

标签: arrays json angular filter


【解决方案1】:

合并,注意:使用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)
            }
        }
     }
}

【讨论】:

  • 首先我想像这样合并 testArray const testArray = [ {PackageID: 7, FormsList: [{Form_Name: "string One"}, {Form_Name: "string Two"}, {Form_Name: “字符串三”}]} {PackageID:11,FormsList:[{Form_Name:“字符串一”},{Form_Name:“字符串二”},{Form_Name:“字符串三”}]}]
【解决方案2】:

那么,让我们开始吧! 我们应该做的第一件事是创建一个PackageID's的列表

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

然后让我们从这个数组中获取唯一值。为此,我们需要分两步进行

  1. 创建函数distinct
const distinct = (value, index, self) => {
    return self.indexOf(value) === index
}
  1. 创建 uniq id 列表
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 }
})

希望对你有帮助

【讨论】:

  • 让我试试 Igore Bezsmertnyi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多