Javascript 使用es6以更好的方式初始化具有未知键的对象数组
我的目标如下:Javascript 使用es6以更好的方式初始化具有未知键的对象数组,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我的目标如下: { "counts": { "created_by_ref": { "00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 1, "0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 1 }, "file.hashes.MD5": { "qqq": 200 }, "ipv4
{
"counts": {
"created_by_ref": {
"00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 1,
"0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 1
},
"file.hashes.MD5": {
"qqq": 200
},
"ipv4_addr.value": {
"127.0.0.1": 200,
"192.168.1.10": 200
},
"network_traffic.dst_port": {
"xxx": 200
},
"network_traffic.dst_ref.resolves_to_refs.value": {
"yyy": 200
},
"network_traffic.dst_ref.value": {
"rrr": 200
}
}
}
{
"counts": {
"created_by_ref": {
"00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 0,
"0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 0
},
"file.hashes.MD5": {
"qqq": 0
},
"ipv4_addr.value": {
"127.0.0.1": 0,
"192.168.1.10": 0
},
"network_traffic.dst_port": {
"xxx": 0
},
"network_traffic.dst_ref.resolves_to_refs.value": {
"yyy": 0
},
"network_traffic.dst_ref.value": {
"rrr": 0
}
}
}
我需要将所有值初始化为0,如下所示:
{
"counts": {
"created_by_ref": {
"00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 1,
"0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 1
},
"file.hashes.MD5": {
"qqq": 200
},
"ipv4_addr.value": {
"127.0.0.1": 200,
"192.168.1.10": 200
},
"network_traffic.dst_port": {
"xxx": 200
},
"network_traffic.dst_ref.resolves_to_refs.value": {
"yyy": 200
},
"network_traffic.dst_ref.value": {
"rrr": 200
}
}
}
{
"counts": {
"created_by_ref": {
"00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 0,
"0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 0
},
"file.hashes.MD5": {
"qqq": 0
},
"ipv4_addr.value": {
"127.0.0.1": 0,
"192.168.1.10": 0
},
"network_traffic.dst_port": {
"xxx": 0
},
"network_traffic.dst_ref.resolves_to_refs.value": {
"yyy": 0
},
"network_traffic.dst_ref.value": {
"rrr": 0
}
}
}
除了count之外,所有的键都是未知的,并且是动态变化的,所以不能是硬代码。
我所做的是:
for (const key in getSearchDataAllCounts) {
if (getSearchDataAllCounts.hasOwnProperty(key)) {
Object.keys(getSearchDataAllCounts[key]).forEach((innerkey) => {
getSearchDataAllCounts[key][innerkey] = 0;
});
}
}
但我真的认为在ES6中有更好的方法。我能做些什么改进,使其更兼容es6,并且更倾向于使用一个循环吗?ES2015+并没有给您带来多少改进,除了和: 你在评论中问: 所以我们不能只用一个循环,对吗 您可以使用看起来像一个循环,但实际上是像上面那样的嵌套循环(实际上是更多的循环): 用于获取外部对象的
[key,value]
对数组,然后用我们创建的新对象替换该对象
- 拿到钥匙
- 将它们映射到
条目[键,0]
- 使用从这些条目创建对象
不过,这里有一个重要的区别:它创建新的对象来存储最外层对象的属性。第一个只是更新现有对象的属性。您不需要ES6。使用JSON替换器,您可以在树遍历上执行此操作 Util 控制台日志(零(d)) 如何使用
var d={
计数:{
由\u ref创建的\u:{
“00f5c303-32c0-4f5f-ac61-bf6577a8f4ed”:1,
“0dde2de1-7951-45b1-8bf3-013f8dbfc4ae”:1
},
“file.hashes.MD5”:{
qqq:200
},
“ipv4地址值”:{
"127.0.0.1": 200,
"192.168.1.10": 200
},
“网络流量。dst端口”:{
xxx:200
},
“网络流量.dst\u ref.将\u解析为\u refs.value”:{
yyy:200
},
“网络流量dst参考值”:{
注册登记率:200
}
}
};
constzero=obj=>JSON.parse(JSON.stringify(obj,(,v)=>(typeof v==“object”?v:0));
控制台日志(零(d))代码>
.as console row{color:blue!important}
我很好奇为什么一个循环中的,而另一个循环中的Object.keys().forEach
是…?@T.J.Crowder所以两个Object.keys()相互之间?对,这样就不需要检查hasOwnProperty
了。只是,它看起来像是有意的选择,使用作为in
作为外循环,使用Object.keys().forEach
作为内循环。如果不是故意的,不用担心,我只是想可能是这样的。:-)您可以使用看起来像一个循环,但实际上是像上面那样的嵌套循环。我会把它添加到答案中。:-)@T.J.Crowder非常感谢,我们将在答案中等待您的更新。我学到了很多:DAlso可以解释是否有一个具体的原因,你的外环是超值的,而不是关键?如果我们有两个具有相同值的唯一键怎么办?@Learner-这没关系,我们会看到值两次。但是,如果您可能真的有两个属性引用同一个对象,那么第二个解决方案将用两个不同的对象替换它们。@Learner-抱歉,我被叫走了。如果您有进一步的后续问题,我回来后会回答。谢谢您,我不应该将第一个循环更改为:for(Object.values的const entry(getSearchDataAllCounts.counts)){.??@Learner-Doh!Yes.:-)编辑。
const zero = obj =>
JSON.parse(JSON.stringify(obj, (_, v) => (typeof v === "object" ? v : 0)));
console.log(zero(d));