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));