对象的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代码:
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”中的一些“间接”循环——但我喜欢它,因为它简单易读。我在这里测试: