对象的javascript数组按uuid更新

对象的javascript数组按uuid更新,javascript,arrays,object,insert-update,Javascript,Arrays,Object,Insert Update,嗨,也许我有点头晕目眩或者只是太累了: 但我找不到更新/操作对象数组的简单解决方案。 (没有几个循环) 我(通过每秒一次侦听器回调)获得以下形式的状态更新: status = { uuid: "1065d90b-1a90", status: "running", data1: "xxx", data2: "xxx", ... } status = { uuid: "4075a90c-2b77", status: "new", data1: "xx

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

我(通过每秒一次侦听器回调)获得以下形式的状态更新:

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: ...}
    }
之后,我可以将完整列表复制到想要的数组表单中。但我真的很想避免这种情况,因为这会在每次(每秒钟)重新创建列表,这是不好的,因为它被用于显示角度表


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

以下是一些psuedo代码:

  • 创建一个空数组(allStatus)
  • 使用.findIndex检查是否有具有该uuid的项,并返回数组中该对象的索引
  • 如果没有具有该uuid的对象,则可以将该对象添加到allStatus数组中
  • 如果存在具有该uuid的对象,则使用allStatus[index]更新该对象
  • 下面是一段代码片段,可以查看它的运行情况:

    const incomingItem={
    uuid:“4075a90c-2b77”,
    状态:“新”,
    数据1:“yyy”,
    数据2:“yyy”,
    }
    const allStatus=[{
    uuid:“1065d90b-1a90”,
    状态:“正在运行”,
    数据1:“xxx”,
    数据2:“xxx”
    },{     
    uuid:“4075a90c-2b77”,
    状态:“新”,
    数据1:“xxx”,
    数据2:“xxx”
    }];
    const index=allStatus.findIndex(item=>item.uuid==incomingItem.uuid)
    如果(索引==-1){
    //项目不在,我们可以添加它
    所有状态推送(收入项目);
    }否则{
    //物品在里面,我们应该更新它
    allStatus[索引]=收入项目;
    }
    
    console.log(allStatus)以下是一些psuedo代码:

  • 创建一个空数组(allStatus)
  • 使用.findIndex检查是否有具有该uuid的项,并返回数组中该对象的索引
  • 如果没有具有该uuid的对象,则可以将该对象添加到allStatus数组中
  • 如果存在具有该uuid的对象,则使用allStatus[index]更新该对象
  • 下面是一段代码片段,可以查看它的运行情况:

    const incomingItem={
    uuid:“4075a90c-2b77”,
    状态:“新”,
    数据1:“yyy”,
    数据2:“yyy”,
    }
    const allStatus=[{
    uuid:“1065d90b-1a90”,
    状态:“正在运行”,
    数据1:“xxx”,
    数据2:“xxx”
    },{     
    uuid:“4075a90c-2b77”,
    状态:“新”,
    数据1:“xxx”,
    数据2:“xxx”
    }];
    const index=allStatus.findIndex(item=>item.uuid==incomingItem.uuid)
    如果(索引==-1){
    //项目不在,我们可以添加它
    所有状态推送(收入项目);
    }否则{
    //物品在里面,我们应该更新它
    allStatus[索引]=收入项目;
    }
    
    console.log(allStatus)
    如果您确实想避免循环(直接或间接地以
    .find()
    .filter()
    ,…)的形式),那么将“状态”的索引存储在对象中,并将uuid作为键:
    {“1065d90b-1a90”:0,“4075a90c-2b77”:1}
    这里无法避免至少在整个数据集中循环一次。您可以将它们存储为UUID:object的对象,并根据需要更新/添加值,然后遍历对象并生成数组。或者,将其存储为所需的数组样式,在数组中循环,直到找到匹配的UUID并更新该索引处的对象。我认为第二种方法可能更好一些,因为当您找到要查找的索引时,可以通过数组打破循环。
    list.push(update)
    ,还是我遗漏了什么?如果您真的想避免循环(直接或间接地以
    .find()
    .filter()
    ,…)然后将一个“状态”的索引存储在一个对象中,uuid作为键:
    {“1065d90b-1a90”:0,“4075a90c-2b77”:1}
    这里无法避免在整个数据集中至少循环一次。您可以将它们存储为UUID:object的对象,并根据需要更新/添加值,然后遍历对象并生成数组。或者,将其存储为所需的数组样式,在数组中循环,直到找到匹配的UUID并更新该索引处的对象。我认为第二种方法可能更好一些,因为当你找到你要查找的索引时,你可以打破数组中的循环。
    list.push(update)
    还是我遗漏了什么?好吧,这可能是“findIndex”中的一些“间接”循环-但我喜欢它,因为它简单易读。我在这里测试过:好吧,这可能是“findIndex”中的一些“间接”循环——但我喜欢它,因为它简单易读。我在这里测试: