Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象数组到包含数组的对象数组_Javascript_Arrays_Javascript Objects - Fatal编程技术网

Javascript 对象数组到包含数组的对象数组

Javascript 对象数组到包含数组的对象数组,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个对象数组: var arr = [ { timemark: "2017-03-01", db_total: c1, db_used: d1, hosts: e1, items: f1 },{ timemark: "2017-03-02", db_total: c2, db_used: d2, hosts: e2,

我有一个对象数组:

 var arr = [
    {
        timemark: "2017-03-01",
        db_total: c1,
        db_used: d1,
        hosts: e1,
        items: f1
    },{
        timemark: "2017-03-02",
        db_total: c2,
        db_used: d2,
        hosts: e2,
        items: f2
    },{
        timemark: "2017-03-03",
        db_total: c3,
        db_used: d3,
        hosts: e3,
        items: f3
    },..]
我正在研究如何将其转换为另一个阵列,但结构不同:

var result = [
    {
        topic: "db_total",
        data: [
            {
                x: "2017-03-01",
                y: c1
            },{
                x: "2017-03-02",
                y: c2
            },{
                x: "2017-03-03",
                y: c3
            },...]
    },{
        topic: "db_used",
        data: [
            {
                x: "2017-03-01",
                y: d1
            },{
                x: "2017-03-02",
                y: d2
            },{
                x: "2017-03-03",
                y: d3
            },...]
    },{
        topic: "hosts",
        data: [
            {
                x: "2017-03-01",
                y: e1
            },{
                x: "2017-03-02",
                y: e2
            },{
                x: "2017-03-03",
                y: e3
            },...]
    },{
        topic: "items",
        data: [
            {
                x: "2017-03-01",
                y: f1
            },{
                x: "2017-03-02",
                y: f2
            },{
                x: "2017-03-03",
                y: f3
            },...]
    },...];
我知道我必须这样做:

//convert
var result = [];
for (var i=0; i<arr.length; i++) {
  result[i]=[arr[i].timemark];
}
几小时后就有点开始了。但是我找不到一种方法来开始在数组中而不是数组中创建对象?试着走小步:

但我在理解代码片段时确实遇到了问题,可能是使用了错误的语法,无法让它正常工作

有人能解释一下在这种情况下如何正确使用循环吗?

您可以使用Array.prototype的函数将数组中的每个元素映射到不同的元素,从而节省数组的长度

例:

变量输入=[{ 时间:2017-03-01, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 },{ 时间:2017-03-02, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 },{ 时间:2017-03-03, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 }]; 变量输出=[{ 主题:“db_总计”, 数据:input.mape=>{x:e.timemark,y:e.db_total} },{ 主题:“使用的数据库”, 数据:input.mape=>{x:e.timemark,y:e.db_used} },{ 主题:"主持人",, 数据:input.mape=>{x:e.timemark,y:e.hosts} },{ 主题:"项目",, 数据:input.mape=>{x:e.timemark,y:e.items} }] console.logoutput您可以使用Array.prototype的函数将数组中的每个元素映射到不同的元素,从而节省数组的长度

例:

变量输入=[{ 时间:2017-03-01, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 },{ 时间:2017-03-02, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 },{ 时间:2017-03-03, db_总计:1, 使用的数据库:1, 主持人:1,, 项目:1 }]; 变量输出=[{ 主题:“db_总计”, 数据:input.mape=>{x:e.timemark,y:e.db_total} },{ 主题:“使用的数据库”, 数据:input.mape=>{x:e.timemark,y:e.db_used} },{ 主题:"主持人",, 数据:input.mape=>{x:e.timemark,y:e.hosts} },{ 主题:"项目",, 数据:input.mape=>{x:e.timemark,y:e.items} }] 控制台。注销输出 var arr=[{ 时间:2017-03-01, db_总计:“c1”, db_使用:“d1”, 主机:“e1”, 项目:“f1” },{ 时间:2017-03-02, db_总计:“c2”, db_使用“d2”, 主持人:"e2",, 项目:“f2” },{ 时间:2017-03-03, db_总计:“c3”, db_使用:“d3”, 主持人:“e3”, 项目:“f3” }]; console.log_getConvertedArrayarr 函数_getConvertedArrayarray{ var-res=[]; array.forEachfunctionobj{ Object.keysobj.forEachfunctionkey{ 再推{ 主题:关键, 数据:\u getTopicDataarr,键 }; }; }; 返回res; } 函数\u getTopicDataarray,主题{ var-res=[]; array.forEachfunctionobj{ 再推{ x:obj.时间标记, y:obj[主题] }; }; 返回res; } var arr=[{ 时间:2017-03-01, db_总计:“c1”, db_使用:“d1”, 主机:“e1”, 项目:“f1” },{ 时间:2017-03-02, db_总计:“c2”, db_使用“d2”, 主持人:"e2",, 项目:“f2” },{ 时间:2017-03-03, db_总计:“c3”, db_使用:“d3”, 主持人:“e3”, 项目:“f3” }]; console.log_getConvertedArrayarr 函数_getConvertedArrayarray{ var-res=[]; array.forEachfunctionobj{ Object.keysobj.forEachfunctionkey{ 再推{ 主题:关键, 数据:\u getTopicDataarr,键 }; }; }; 返回res; } 函数\u getTopicDataarray,主题{ var-res=[]; array.forEachfunctionobj{ 再推{ x:obj.时间标记, y:obj[主题] }; }; 返回res;
} 你可以做这样的逻辑;映射每个分组,并编译最终结果对象

var arr=[ { 时间:2017-03-01, db_总计:c1, 使用的数据库:d1, 主持人:e1,, 项目:f1 },{ 时间:2017-03-02, db_总计:c2, 使用的db_:d2, 主持人:e2, 项目:f2 },{ 时间:2017-03-03, db_总计:c3, 使用的db_:d3, 主持人:e3, 项目:f3 }]; var结果=[]; Object.keysarr[0] .filterfield=>字段!=时间标记 .forEachfield=>result.pushfinalObjfield,arr.mape=>xye.timemark,e[field]; console.logresult; 函数xyx,y{ 返回{x:x,y:y}; } 函数finalObjname,arr{ 返回{topic:name,data:arr};
} 你可以做这样的逻辑;映射每个分组,并编译最终结果对象

var arr=[ { 时间:2017-03-01, db_总计:c1, 使用的数据库:d1, 主持人:e1,, 项目:f1 },{ 时间:2017-03-02, db_总计:c2, 使用的db_:d2, 主持人:e2, 项目:f2 },{ 时间:2017-03-03, db_总计:c3, 使用的db_:d3, 主持人:e3, 项目:f3 }]; var结果=[]; Object.keysarr[0] .filterfield=>字段!=时间标记 .forEachfield=>result.pushfinalObjfield,arr.mape=>xye.timemark,e[field]; console.logresult; 函数xyx,y{ 返回{x:x,y:y}; } 函数finalObjname,arr{ 返回{topic:name,data:arr};
} 您可以使用reduce来实现这一点

var arr=[{时间:2017-03-01,数据库总计:'c1',数据库总计:'d1',主机:'e1',项目:'f1'},{时间:2017-03-02,数据库总计:'c2',数据库总计:'d2',主机:'e2',项目:'f2'},{时间:2017-03-03,数据库总计:'c3',数据库总计:'d3',主机:'e3',项目:'f3}; 设res=arr.reducea,b=>{ 让我们输入b{ 如果b.hasOwnPropertykey&&key!='timemark'&&!a.findv=>v.topic===key{ a、 推{ 主题:关键, 数据:arr.mapo=>{ x:o.时间标记, y:o[键] } }; } } 返回a; }, [];
console.logres 您可以使用reduce来实现这一点

var arr=[{时间:2017-03-01,数据库总计:'c1',数据库总计:'d1',主机:'e1',项目:'f1'},{时间:2017-03-02,数据库总计:'c2',数据库总计:'d2',主机:'e2',项目:'f2'},{时间:2017-03-03,数据库总计:'c3',数据库总计:'d3',主机:'e3',项目:'f3}; 设res=arr.reducea,b=>{ 让我们输入b{ 如果b.hasOwnPropertykey&&key!='timemark'&&!a.findv=>v.topic===key{ a、 推{ 主题:关键, 数据:arr.mapo=>{ x:o.时间标记, y:o[键] } }; } } 返回a; }, [];
console.logres 作为一个相当简单但非常具体的函数,您可以创建一个空结果数组并填充它:

var arr=[ { 时间:2017-03-01, db_总计:“c1”, db_使用:“d1”, 主机:“e1”, 项目:“f1” },{ 时间:2017-03-02, db_总计:“c2”, db_使用“d2”, 主持人:"e2",, 项目:“f2” },{ 时间:2017-03-03, db_总计:“c3”, db_使用:“d3”, 主持人:“e3”, 项目:“f3” } ]; var result=[{topic:db_total,数据:[]}, {主题:使用db_,数据:[]}, {主题:主机,数据:[]}, {主题:项,数据:[]} ]; arr.forEachfunction对象{ 结果[0]。data.push{x:obj.timemark,y:obj.db_total}; 结果[1]。data.push{x:obj.timemark,y:obj.db_used}; 结果[2]。data.push{x:obj.timemark,y:obj.hosts}; 结果[3]。data.push{x:obj.timemark,y:obj.items}; };
console.logresult 作为一个相当简单但非常具体的函数,您可以创建一个空结果数组并填充它:

var arr=[ { 时间:2017-03-01, db_总计:“c1”, db_使用:“d1”, 主机:“e1”, 项目:“f1” },{ 时间:2017-03-02, db_总计:“c2”, db_使用“d2”, 主持人:"e2",, 项目:“f2” },{ 时间:2017-03-03, db_总计:“c3”, db_使用:“d3”, 主持人:“e3”, 项目:“f3” } ]; var result=[{topic:db_total,数据:[]}, {主题:使用db_,数据:[]}, {主题:主机,数据:[]}, {主题:项,数据:[]} ]; arr.forEachfunction对象{ 结果[0]。data.push{x:obj.timemark,y:obj.db_total}; 结果[1]。data.push{x:obj.timemark,y:obj.db_used}; 结果[2]。data.push{x:obj.timemark,y:obj.hosts}; 结果[3]。data.push{x:obj.timemark,y:obj.items}; };
console.logresult;刚刚注意到我对你所说的错了,编辑我的答案。刚刚注意到我对你所说的错了,编辑我的答案。为什么要用小提琴?只需将其作为可运行的代码片段发布在这里。为什么要使用小提琴?只需将其作为一个可运行的片段发布在这里。太棒了!!!你能解释一下在哪里使用函数xy吗?我基本上理解了其他的一切:它在arr的映射中,只是不想在算法部分使用这种硬编码:但是如果您愿意,可以将它们移动到那里,使其成为一行。我看到的唯一问题是,您没有防范对象继承的可枚举属性。类似Object.keysarr[0].reduce…,[]的东西将修复此问题,并一次性创建结果数组。否则,非常优雅。@RobG,您的意思是在对每个对象字段执行操作时,可能会弹出一些继承的字段等吗?使用Object.keysobj可以避免这个问题吗?不,因为..in是问题所在。它迭代所有可枚举属性,包括继承的属性。key只获得自己的属性,比hasOwnProperty检查简单一点。太棒了!!!你能解释一下在哪里使用函数xy吗?我基本上理解了其他的一切:它在arr的映射中,只是不想在算法部分使用这种硬编码:但是如果你愿意,你可以将它们移动到那里,使其成为一行。我看到的唯一问题是你
e不防止对象继承的可枚举属性。类似Object.keysarr[0].reduce…,[]的东西将修复此问题,并一次性创建结果数组。否则,非常优雅。@RobG,您的意思是在对每个对象字段执行操作时,可能会弹出一些继承的字段等吗?使用Object.keysobj可以避免这个问题吗?不,因为..in是问题所在。它迭代所有可枚举属性,包括继承的属性。key只获取自己的属性,比hasOwnProperty检查要简单一些。
[
    [2017-03-01],
    [2017-03-02],
    [2017-03-03]
]
var result = arr.map(e => ({x: e.timemark, y:db_total}));