简体   繁体   English

Javascript 过滤数组中的对象并返回数组中 Object 中 Object 的属性

[英]Javascript Filter Objects in Array and return Property of Object in Array of Object in Array

Im trying to Filter this Array:我试图过滤这个数组:

var Zimmer = [{"Name":"F02A","Group":"Office","Devices":[
    {"Name":"F02A-1313.01","Device":"00265BE98E8C53","Type":"HmIP-WTH-B"},
    {"Name":"F02A-1315.03","Device":"00201BE9A13271","Type":"HmIP-eTRV-B"},
    {"Name":"F02A-1354.01","Device":"00119A499C1313","Type":"HmIP-eTRV-C"}
]},
{"Name":"F1","Group":"Office","Devices":[
    {"Name":"F1-1315.04","Device":"00201BE9A1381B","Type":"HmIP-eTRV-B"}
]},
{"Name":"F2","Group":"Klassenzimmer","Devices":[
    {"Name":"F2-1315.02","Device":"00201BE9A137E5","Type":"HmIP-eTRV-B"}
]},
{"Name":"F6","Group":"Office","Devices":[
    {"Name":"F6-1315.01","Device":"00201BE9A13290","Type":"HmIP-eTRV-B"}
]}]

And I want to output every Device with the Name F02A.我想 output 每个设备名称为 F02A。 example: 00265BE98E8C53 and than second output 00201BE9A13271.例如:00265BE98E8C53 和第二个 output 00201BE9A13271。

For that I wrote the code为此,我编写了代码

msg.payload = Zimmer.forEach(element => element.filter(name => name.Name = "F02A"));

Can somebody help?有人可以帮忙吗?

You could take Array#flatMap and check if the name starts with the wanted part.您可以使用Array#flatMap并检查名称是否以所需部分开头。

 const zimmer = [{ Name: "F02A", Group: "Office", Devices: [{ Name: "F02A-1313.01", Device: "00265BE98E8C53", Type: "HmIP-WTH-B" }, { Name: "F02A-1315.03", Device: "00201BE9A13271", Type: "HmIP-eTRV-B" }, { Name: "F02A-1354.01", Device: "00119A499C1313", Type: "HmIP-eTRV-C" }] }, { Name: "F1", Group: "Office", Devices: [{ Name: "F1-1315.04", Device: "00201BE9A1381B", Type: "HmIP-eTRV-B" }] }, { Name: "F2", Group: "Klassenzimmer", Devices: [{ Name: "F2-1315.02", Device: "00201BE9A137E5", Type: "HmIP-eTRV-B" }] }, { Name: "F6", Group: "Office", Devices: [{ Name: "F6-1315.01", Device: "00201BE9A13290", Type: "HmIP-eTRV-B" }] }], result = zimmer.flatMap(({ Devices }) => Devices.flatMap(({ Name, Device }) => Name.startsWith('F02A')? Device: []) ); console.log(result);

Using reduce method to loop through your array then check condition(check 'Name' is matched) each array, if your condition match then use map to make your devices to array, then concat to output使用reduce方法循环遍历您的数组,然后检查条件(检查“名称”是否匹配)每个数组,如果您的条件匹配,则使用map使您的设备排列,然后连接到 output

Zimmer.reduce((acc,data)=>{
    if(data.Name === "F02A"){
        acc = acc.concat(data.Devices.map((device)=>device.Device))
    }
    return acc
},[])

// output: ["00265BE98E8C53", "00201BE9A13271", "00119A499C1313"]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM