繁体   English   中英

我如何才能仅获得保留一个属性的两个数组对象之间的差异?

[英]How i can get only the difference between two array objects keeping one property?

我有这两个对象数组:

const groupScreens = [
  {
      "id": "6b7c1891-e98f-4ca5-87db-7d4578268b8f",
      "name": "Cad 1",
      "screen_id": "7b9bb725-2fa8-4416-a664-37395d28da95",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": false,
      "allow_create": true,
      "allow_update": false,
      "allow_delete": false,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  },
  {
      "id": "7ae7c727-6dd3-43ab-be91-816e34da42ce",
      "name": "Cad 2",
      "screen_id": "b1793127-09f1-4c70-982d-c2cea57709ee",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": true,
      "allow_create": true,
      "allow_update": true,
      "allow_delete": true,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  },
  {
      "id": "1de0a773-9df8-4e7c-98c0-e12d2f79a3d3",
      "name": "Cad 3",
      "screen_id": "b829677f-c597-48e5-b50d-736b0a1bda00",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": true,
      "allow_create": true,
      "allow_update": false,
      "allow_delete": true,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  }
]

const changedGroupScreen = [
  {
      "id": "6b7c1891-e98f-4ca5-87db-7d4578268b8f",
      "name": "Cad 1",
      "screen_id": "7b9bb725-2fa8-4416-a664-37395d28da95",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": false,
      "allow_create": true,
      "allow_update": true,
      "allow_delete": true,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  },
  {
      "id": "7ae7c727-6dd3-43ab-be91-816e34da42ce",
      "name": "Cad 2",
      "screen_id": "b1793127-09f1-4c70-982d-c2cea57709ee",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": true,
      "allow_create": true,
      "allow_update": true,
      "allow_delete": true,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  },
  {
      "id": "1de0a773-9df8-4e7c-98c0-e12d2f79a3d3",
      "name": "Cad 3",
      "screen_id": "b829677f-c597-48e5-b50d-736b0a1bda00",
      "group_id": "319588ba-8c5d-474b-aaf2-2ea8fbfed898",
      "allow_read": true,
      "allow_create": true,
      "allow_update": false,
      "allow_delete": false,
      "created_at": "2020-04-07 08:32:58",
      "updated_at": "2020-04-07 08:32:58"
  }
]

我需要通过属性screen_id比较这两个 arrays 并返回changedGroupScreen保留属性screen_id的差异。

我需要这个结果:

const result = [{
    "screen_id": "7b9bb725-2fa8-4416-a664-37395d28da95",
    "allow_update": true,
    "allow_delete": true
}, {
    "screen_id": "b829677f-c597-48e5-b50d-736b0a1bda00",
    "allow_delete": false
}]

我收到:无法设置未定义的属性 screen_id:

let result = [{}]
let countResult = 0
let foundedDifference = false
for (let i_group_screens = 0 ; i_group_screens < groupScreens.length; i_group_screens++) {
  foundedDifference = false
  for (let i_changed = 0; i_changed < changedGroupScreen.length; i_changed++) {
    if (groupScreens[i_group_screens].screen_id === changedGroupScreen[i_changed].screen_id) {
      if(groupScreens[i_group_screens].allow_read !== changedGroupScreen[i_changed].allow_read) {
        result[countResult].screen_id = groupScreens[i_group_screens].screen_id
        result[countResult].allow_read = changedGroupScreen[i_changed].allow_read
        foundedDifference = true
      }
      if(groupScreens[i_group_screens].allow_create !== changedGroupScreen[i_changed].allow_create) {
        result[countResult].screen_id = groupScreens[i_group_screens].screen_id
        result[countResult].allow_create = changedGroupScreen[i_changed].allow_create
        foundedDifference = true
      }
      if(groupScreens[i_group_screens].allow_update !== changedGroupScreen[i_changed].allow_update) {
        console.log(countResult)
        result[countResult].screen_id = groupScreens[i_group_screens].screen_id
        result[countResult].allow_update = changedGroupScreen[i_changed].allow_update
        foundedDifference = true
      }
      if(groupScreens[i_group_screens].allow_delete !== changedGroupScreen[i_changed].allow_delete) {
        result[countResult].screen_id = groupScreens[i_group_screens].screen_id
        result[countResult].allow_delete = changedGroupScreen[i_changed].allow_delete
        foundedDifference = true
      }
      if(foundedDifference === true) {
        countResult++
      }
    }
  }
}

如果有人需要这样的东西,我可以这样工作:

let result = []
let countResult = 0
let foundedDifference = false

for (let i_group_screens = 0 ; i_group_screens < groupScreens.length; i_group_screens++) {
  foundedDifference = false
  for (let i_changed = 0; i_changed < changedGroupScreen.length; i_changed++) {
    if (groupScreens[i_group_screens].screen_id === changedGroupScreen[i_changed].screen_id) {
      if(groupScreens[i_group_screens].allow_read !== changedGroupScreen[i_changed].allow_read) {
        let obj = {screen_id: groupScreens[i_group_screens.screen_id], allow_read: changedGroupScreen[i_changed].allow_read}
        result.push(obj)
        foundedDifference = true
      }
      if(groupScreens[i_group_screens].allow_create !== changedGroupScreen[i_changed].allow_create) {
        if (foundedDifference === true) {
          result[countResult].allow_create = changedGroupScreen[i_changed].allow_create
        } else {
          let obj = {screen_id: groupScreens[i_group_screens].screen_id, allow_create: changedGroupScreen[i_changed].allow_create}
          result.push(obj)
        }
      }
      if(groupScreens[i_group_screens].allow_update !== changedGroupScreen[i_changed].allow_update) {
        if (foundedDifference === true) {
          result[countResult].allow_update = changedGroupScreen[i_changed].allow_update
        } else {
          let obj = {screen_id: groupScreens[i_group_screens].screen_id, allow_update: changedGroupScreen[i_changed].allow_update}
          result.push(obj)
        }
        foundedDifference = true
      }
      if(groupScreens[i_group_screens].allow_delete !== changedGroupScreen[i_changed].allow_delete) {
        if(foundedDifference === true) {
          result[countResult].allow_delete = changedGroupScreen[i_changed].allow_delete
        }else {
          let obj = {screen_id: groupScreens[i_group_screens].screen_id, allow_delete: changedGroupScreen[i_changed].allow_delete}
          result.push(obj)
        }
        foundedDifference = true
      }
      if(foundedDifference === true) {
        countResult++
      }
    }
  }
}

可能不是最好的解决方案(这么多代码),但按我的预期工作。 (如果您有一些技巧可以做得更好,请随时发表评论)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM