javascript对象数组通过uuid更新

时间:2018-08-22 14:01:14

标签: javascript arrays object insert-update

嗨,也许我是呆呆的或者只是累了:
但是我找不到更新/操作对象数组的简单解决方案。 (没有几个循环)

我正在(每秒通过侦听器回调)获取以下形式的状态更新:

status = {     
  uuid: "1065d90b-1a90",
  status: "running",
  data1: "xxx", 
  data2: "xxx", ...
}
status = {     
  uuid: "4075a90c-2b77",
  status: "new",
  data1: "xxx", 
  data2: "xxx", ...
}

它可能是新数据集(具有新的uniq uuid),也可能是现有数据集的更新(现有uuid)

我想将它们收集在一个表中,并且需要以下形式的数组:

 [ {uuid: "1065d90b-1a90", status: "running", data1:"xxx", ...},
   {uuid: "4075a90c-2b77", status: "new", data1: "xxx", ...}, {uuid: ...} ]

我尝试了基于uuid作为索引的哈希列表(更好的键:值):

let allStatus[status.uuid] = status

此方法有效且易于更新,但会产生:

    {  1065d90b-1a90: {uuid: "1065d90b-1a90", status: "running", data1:"xxx", ...},
       4075a90c-2b77: {uuid: "4075a90c-2b77", status: "new", data1: "xxx", ...}, 
       xxxxxxxx-xxxx: {uuid: ...}
    }

之后,我可以将完整列表复制到所需的数组形式。但是我真的很想避免这种情况,因为这将每次(每秒)重新创建列表,这不好,因为它在角度表中用于显示。

如何改善和直接更新(创建)列表/阵列?

1 个答案:

答案 0 :(得分:1)

以下是一些伪代码:

  1. 创建一个空数组(allStatus)
  2. 使用.findIndex来检查是否存在带有该uuid的项目,并返回该对象在数组中的索引。
  3. 如果没有带有该uuid的对象,则可以将该对象添加到allStatus数组中
  4. 如果有一个带有该uuid的对象,则使用allStatus [index]
  5. 更新该对象

下面是一个代码片段,供您实际使用:

 sh 'sudo docker exec broccoli_app_1 codecept run unit --env edge --coverage-html'

在这里您可以看到,entryItem与allStatus中的item2具有相同的uuid,只是data1和data2不同。因此,我们对其进行了更新。

您可以尝试更改incomingItem的uuid并将其注销。 allStatus应该包含三个项目。

现在,您可以在角度代码中遍历allStatus。