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