将我的复杂对象格式化为另一个复杂对象时遇到很大的问题。 我从传入的设备消息中获得第一类复杂对象。我无法更改传入消息的格式。
我尝试将消息格式化为另一个复杂的对象,以在程序的其他位置使用它。
这是传入消息的格式:
var measures = [
{
dev: "test",
usg: "IMPORT",
vals: [
{ val: 1000, date: "2019-01-01T00:00:00Z"},
{ val: 2000, date: "2019-01-02T00:00:00Z"},
{ val: 3000, date: "2019-01-03T00:00:00Z"}
]
},
{
dev: "test2",
usg: "EXPORT",
vals: [
{ val: 300, date: "2019-01-01T00:00:00Z"},
{ val: 400, date: "2019-01-02T00:00:00Z"},
{ val: 500, date: "2019-01-03T00:00:00Z"}
]
}
];
我得到的2项措施的日期相同。那完全正常,这就是我要使用的。
现在是预期格式。日期必须是以日期为键的字典。
Dates = [
{
"2019-01-01T00:00:00Z" : {
{usg : "IMPORT", dev : "test", val : 1000 },
{usg : "EXPORT", dev : "test2" val : 300 }
},
{
"2019-01-02T00:00:00Z" : {
{ usg : "IMPORT", dev : "test", val : 2000},
{ usg : "EXPORT", dev : "test2", val : 400 }
},
{
"2019-01-03T00:00:00Z" : {
{ usg : "IMPORT", dev : "test", val : 3000},
{ usg : "EXPORT", dev : "test2", val : 500 }
}
];
我设法得到了这样的字典:
Dates = [
{
"2019-01-01T00:00:00Z" : {
{ val : 1000 },
{ val : 300 }
},
{
"2019-01-02T00:00:00Z" : {
{ val : 2000},
{ val : 400 }
},
{
"2019-01-03T00:00:00Z" : {
{ val : 3000},
{ val : 500 }
}
];
使用以下代码,但在.map方法的最后一部分中无法到达“ usg”和“ dev”属性。
var dates = measures.map(varVals => varVals.vals)
.reduce((a, b) => a.concat(b))
.map(varDates => varDates.date);
var dicoVal = {};
dates.forEach(date => dicoVal[date] =
measures.map(varVals => varVals.vals)
.reduce((a, b) => a.concat(b))
.filter(item => item.date == date)
.map(valeur => { val : valeur.val}));
我试图获取“ varVals.usg”或“ varVals.dev”,但无法访问,我知道为什么,但是我找不到解决方案。
那是我的问题。
感谢您的阅读!
希望您会喜欢解决我的问题:D
答案 0 :(得分:2)
假设内部对象是一个数组,则可以使用reduce
将数组汇总为一个对象。使用Object.values()
将对象转换为数组。
使用forEach
遍历数组。
var measures = [{"dev":"test","usg":"IMPORT","vals":[{"val":1000,"date":"2019-01-01T00:00:00Z"},{"val":2000,"date":"2019-01-02T00:00:00Z"},{"val":3000,"date":"2019-01-03T00:00:00Z"}]},{"dev":"test2","usg":"EXPORT","vals":[{"val":300,"date":"2019-01-01T00:00:00Z"},{"val":400,"date":"2019-01-02T00:00:00Z"},{"val":500,"date":"2019-01-03T00:00:00Z"}]}];
var date = Object.values(measures.reduce((c, v) => {
v.vals.forEach(o => {
c[o.date] = c[o.date] || {[o.date]: []};
c[o.date][o.date].push({usg: v.usg,dev: v.dev,val: o.val});
})
return c;
}, {}));
console.log(date);