【问题标题】:How to update a complex json object based on array of objects如何根据对象数组更新复杂的 json 对象
【发布时间】:2020-12-15 23:23:42
【问题描述】:

我有 2 个数据结构,如下所示

数据1:

{
  purchaceOrder: [{
      name: "Purchase Order",
      version: 1,
      description: "purchase order process",
      saved: true,
      visibility: true
    },
    {
      name: "Purchase Order",
      version: 2,
      description: "purchase order process",
      saved: false,
      visibility: true
    }
  ],
  requestOrder: [{
      name: "Request Order",
      version: 1,
      description: "request order process",
      saved: true,
      visibility: true
    },
    {
      name: "Request Order",
      version: 2,
      description: "request order process",
      saved: false,
      visibility: true
    }
  ],
  cancelOrder: [{
    name: "Cancel Order",
    version: 1,
    description: "cancel order process",
    saved: false,
    visibility: false
  }]
}

数据2:

[
  {
    id: "dwffrgefg68964",
    name: "Purchase Order",
    version: 1
  },
  {
    id: "emffrgefg68964",
    name: "Purchase Order",
    version: 2
  },
  {
    id: "iuffrgefg68964",
    name: "request Order",
    version: 1
  }
]
  

我想根据名称过滤data1,将data2中的id添加到data1中的每个对象,如果在data2中找不到进程名称,则删除data1中的整个对象/空数组,如下所示

最终结果:

{
  purchaceOrder: [{
      id: "dwffrgefg68964"
      name: "Purchase Order",
      version: 1,
      description: "purchase order process",
      saved: true,
      visibility: true
    },
    {
      id: "emffrgefg68964"
      name: "Purchase Order",
      version: 2,
      description: "purchase order process",
      saved: false,
      visibility: true
    }
  ],
  requestOrder: [{
    id: "iuffrgefg68964"
    name: "Request Order",
    version: 1,
    description: "request order process",
    saved: true,
    visibility: true
  }]
}

我尝试了各种解决方案,但无法获得预期的结果。这就是我所拥有的:

getAllProcess(){
for (let key in data1) {
  var temp1 = data1[key];
  for (let i = 0; i < temp1.length; i++) {
      const reqModel = data2.find(process=> process.name === temp1[i].name&& process.version === temp1[i].version);
    if(reqModel){
      temp1[i].id=reqModel.id;
        data1[key][i]=temp1[i];
    }
    }}
    return data1;
}

【问题讨论】:

  • 如果savedvisibility 属性在data2 中不存在,你如何定义它?
  • @OsmanOmar 两个数据都来自后端不同的表。我只想使用具有 id 的进程修改 data1。

标签: arrays json angular typescript


【解决方案1】:

我为你做了一些算法。它使用空数组创建data1,然后通过name 属性推送data2 项目。

const data1 = {
  requestOrder: [],
  purchaseOrder: [],
  cancelOrder: []
};
const data2 = ...;
data2.forEach((d) => {
  if (d.name == 'Request Order') {
    data1.requestOrder.push(d);
  } else if (d.name == 'Purcase Order') {
    data1.purchaseOrder.push(d);
  } else {
    data1.cancelOrder.push(d);
  }
});

【讨论】:

    【解决方案2】:

    您的代码很接近;您只需删除data1 中在data2 中没有对应值的条目:

    let data1 = {
      purchaseOrder: [{
          name: "Purchase Order",
          version: 1,
          description: "purchase order process",
          saved: true,
          visibility: true
        },
        {
          name: "Purchase Order",
          version: 2,
          description: "purchase order process",
          saved: false,
          visibility: true
        }
      ],
      requestOrder: [{
          name: "Request Order",
          version: 1,
          description: "request order process",
          saved: true,
          visibility: true
        },
        {
          name: "Request Order",
          version: 2,
          description: "request order process",
          saved: false,
          visibility: true
        }
      ],
      cancelOrder: [{
        name: "Cancel Order",
        version: 1,
        description: "cancel order process",
        saved: false,
        visibility: false
      }]
    };
    
    let data2 = [{
        id: "dwffrgefg68964",
        name: "Purchase Order",
        version: 1
      },
      {
        id: "emffrgefg68964",
        name: "Purchase Order",
        version: 2
      },
      {
        id: "iuffrgefg68964",
        name: "Request Order",
        version: 1
      }
    ];
    
    function getAllProcess() {
      for (let key in data1) {
        var temp1 = data1[key];
        for (let i = temp1.length - 1; i >= 0; i--) {
          const reqModel = data2.find(process => process.name === temp1[i].name && process.version === temp1[i].version);
          if (reqModel) {
            temp1[i].id = reqModel.id;
            data1[key][i] = temp1[i];
          } else {
            data1[key].splice(i, 1);
          }
        }
        if (!data1[key].length) {
          delete data1[key];
        }
      }
      return data1;
    }
    
    console.log(getAllProcess());

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2021-09-12
      • 2021-01-21
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多