如何将一个复杂对象格式化为另一个复杂对象?

时间:2019-05-03 15:44:19

标签: javascript

将我的复杂对象格式化为另一个复杂对象时遇到很大的问题。 我从传入的设备消息中获得第一类复杂对象。我无法更改传入消息的格式。

我尝试将消息格式化为另一个复杂的对象,以在程序的其他位置使用它。

这是传入消息的格式:

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

1 个答案:

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