Javascript 如何在数组中迭代两次
如何通过在数组中迭代两次从数组中获取数据。例如,我有一个数据集:Javascript 如何在数组中迭代两次,javascript,angularjs,underscore.js,Javascript,Angularjs,Underscore.js,如何通过在数组中迭代两次从数组中获取数据。例如,我有一个数据集: var data = [ {"Fruits ":"Apples","Fresh":"12","Rotten":"5","Total":"17"}, {"Fruits ":"Oranges","Fresh":"34","Rotten":"6","Total":"40"}, {"Fruits ":"Strawberries","Fresh":"67","Rotten":"8","Total":"75"},
var data = [
{"Fruits ":"Apples","Fresh":"12","Rotten":"5","Total":"17"},
{"Fruits ":"Oranges","Fresh":"34","Rotten":"6","Total":"40"},
{"Fruits ":"Strawberries","Fresh":"67","Rotten":"8","Total":"75"},
{"Fruits ":"Bananas","Fresh":"23","Rotten":"5","Total":"28"}
]
首先,我想在右边迭代,得到所有的关键点,直到第一个对象结束,然后向下,这样我就得到了所有关键点的值
预期产量
到目前为止,我已经尝试过:
var categorie = []
var seriesNames = []
var series = []
for(var i=0; i<data.length; i++){
categorie.push(_.values(data[i])[0])
}
for(i=1; i<data.length; i++){
seriesNames.push(_.keys(data[0])[i])
}
但是我被困在如何获取数据数组并将其与seriesName连接起来。实时复制:
编辑
键、值和数据长度是可变的,因为我处理的是动态数据。这里有一种方法:
var output = data.reduce(function(acc, cur) {
for(var k in cur) {
if (!cur.hasOwnProperty(k) || k === 'Fruits ') {
continue;
}
var container = acc.filter(function(item) {
return item.name === k;
})[0];
if (!container) {
container = {
name: k,
data: []
};
acc.push(container);
}
container.data.push(cur[k])
}
return acc;
},[]);
这里有一种方法:
var output = data.reduce(function(acc, cur) {
for(var k in cur) {
if (!cur.hasOwnProperty(k) || k === 'Fruits ') {
continue;
}
var container = acc.filter(function(item) {
return item.name === k;
})[0];
if (!container) {
container = {
name: k,
data: []
};
acc.push(container);
}
container.data.push(cur[k])
}
return acc;
},[]);
您可以使用组数组,并将其用于结果数组中的正确分组 var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}, 组=[新鲜、腐烂、总计], 结果=[]; data.foreacha函数{ 组。功能b,i{ 结果[i]=结果[i]|{名称:b,数据:[]}; 结果[i].data.push+a[b]; }; };
console.logresult 您可以使用组数组,并将其用于结果数组中的正确分组 var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}, 组=[新鲜、腐烂、总计], 结果=[]; data.foreacha函数{ 组。功能b,i{ 结果[i]=结果[i]|{名称:b,数据:[]}; 结果[i].data.push+a[b]; }; };
console.logresult 我建议您直接使用输出对象,然后将它们添加到数组中: var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}]; var fresh={name:'fresh',数据:[]}; var roott={name:'roott',数据:[]}; var total={name:'total',数据:[]}; data.ForeachFunction水果{ 新鲜。数据。推送+水果。新鲜; 腐烂。数据。推送+水果。腐烂; 总计。数据。推送+水果。总计 }; var输出=[新鲜、腐烂、总];
console.logoutput 我建议您直接使用输出对象,然后将它们添加到数组中: var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}]; var fresh={name:'fresh',数据:[]}; var roott={name:'roott',数据:[]}; var total={name:'total',数据:[]}; data.ForeachFunction水果{ 新鲜。数据。推送+水果。新鲜; 腐烂。数据。推送+水果。腐烂; 总计。数据。推送+水果。总计 }; var输出=[新鲜、腐烂、总]; console.logoutput 因为您使用的是下划线,所以它实际上是集合上非常简单的映射 首先,找到对象的关键点 稍后,使用map可以获得对象所需的属性
var keys = _.keys(data[0]).reverse()
keys = _.without(keys, keys[0])
var c = _.map(keys, function(k) {
return {
name: k,
data: _.map(data, k)
};
});
还有一个plunker:因为您使用的是下划线,所以它实际上是集合上非常简单的映射
首先,找到对象的关键点
稍后,使用map可以获得对象所需的属性
var keys = _.keys(data[0]).reverse()
keys = _.without(keys, keys[0])
var c = _.map(keys, function(k) {
return {
name: k,
data: _.map(data, k)
};
});
也可使用plunker:使用:
var arr=[
{水果:苹果,新鲜:12个,腐烂:5个,总计:17个},
{水果:橙子,新鲜:34,腐烂:6,总计:40},
{水果:草莓,新鲜:67,腐烂:8,总计:75},
{水果:香蕉,新鲜:23,腐烂:5,总计:28}
];
var newArr=[Fresh,Rotter,Total].mapfunctionitem{
返回{
名称:项目,
数据:arr.mapfunctioninnerItem{
返回ParseIntinerItem[项目],10;
}
}
};
console.lognewArr 使用:
var arr=[
{水果:苹果,新鲜:12个,腐烂:5个,总计:17个},
{水果:橙子,新鲜:34,腐烂:6,总计:40},
{水果:草莓,新鲜:67,腐烂:8,总计:75},
{水果:香蕉,新鲜:23,腐烂:5,总计:28}
];
var newArr=[Fresh,Rotter,Total].mapfunctionitem{
返回{
名称:项目,
数据:arr.mapfunctioninnerItem{
返回ParseIntinerItem[项目],10;
}
}
};
console.lognewArr 您可以尝试以下方法:
[{"name":"Fresh","data":["12","34","67","23"]},
{"name":"Rotten","data":["5","6","8","5"]},
{"name":"Total","data":["17","40","75","28"]}]
您可以拥有需要排除的密钥列表,并基于此列表处理密钥
var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},
{水果:橙子,新鲜:34,腐烂:6,总计:40},
{水果:草莓,新鲜:67,腐烂:8,总计:75},
{水果:香蕉,新鲜:23,腐烂:5,总计:28}
]
var key_to_exclude=[水果];
var_tmp={};
data.foreacho函数{
对于变量k in o{
如果键_到_排除.indexOfk.trim<0{
_tmp[k]=_tmp[k]| |[];
_tmp[k].普索[k];
}
}
};
var result=Object.keys\u tmp.mapfunctionk{
返回{
姓名:k,,
数据:_tmp[k]
}
};
document.getElementByIdr.innerHTML=JSON.stringifyresult,0,4;
你可以试试类似的东西
这:
您可以拥有需要排除的密钥列表,并基于此列表处理密钥
var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},
{水果:橙子,新鲜:34,腐烂:6,总计:40},
{水果:草莓,新鲜:67,腐烂:8,总计:75},
{水果:香蕉,新鲜:23,腐烂:5,总计:28}
]
var key_to_exclude=[水果];
var_tmp={};
data.foreacho函数{
对于变量k in o{
如果键_到_排除.indexOfk.trim<0{
_tmp[k]=_tmp[k]| |[];
_tmp[k].普索[k];
}
}
};
var result=Object.keys\u tmp.mapfunctionk{
返回{
姓名:k,,
数据:_tmp[k]
}
};
document.getElementByIdr.innerHTML=JSON.stringifyresult,0,4;
试试这个:
var result = [
{'name':'Fresh', 'data':[]},
{'name':'Rotten', 'data':[]},
{'name':'Total', 'data':[]}
];
for (d of data) {
result[0].data.push(d['Fresh']);
result[1].data.push(d['Rotten']);
result[2].data.push(d['Total']);
}
输出如下所示:
[{"name":"Fresh","data":["12","34","67","23"]},
{"name":"Rotten","data":["5","6","8","5"]},
{"name":"Total","data":["17","40","75","28"]}]
试试这个:
var result = [
{'name':'Fresh', 'data':[]},
{'name':'Rotten', 'data':[]},
{'name':'Total', 'data':[]}
];
for (d of data) {
result[0].data.push(d['Fresh']);
result[1].data.push(d['Rotten']);
result[2].data.push(d['Total']);
}
输出如下所示:
[{"name":"Fresh","data":["12","34","67","23"]},
{"name":"Rotten","data":["5","6","8","5"]},
{"name":"Total","data":["17","40","75","28"]}]
我推荐上面@nina scholz的答案。但是,如果有人想了解在简单JS中是如何完成的,请参阅以下代码:
var data = [{"Fruits ":"Apples","Fresh":"12","Rotten":"5","Total":"17"},
{"Fruits ":"Oranges","Fresh":"34","Rotten":"6","Total":"40"},
{"Fruits ":"Strawberries","Fresh":"67","Rotten":"8","Total":"75"},
{"Fruits ":"Bananas","Fresh":"23","Rotten":"5","Total":"28"}]
//list of items that needs to be in the final list
var categorie = ["Fresh", "Rotten", "Total"];
var seriesNames = {};
var series = [];
// iterate through the initial array
for(var i=0; i<data.length; i++){
// iterate through the category
for(var j=0; j<categorie.length; j++) {
if(data[i].hasOwnProperty(categorie[j])) {
// seriesNames will hold the category name and corresponding value will be an array of values(total, rotten, fresh) from all objects
if(seriesNames[categorie[j]]) { // array already exists
var arr = seriesNames[categorie[j]];
arr.push(data[i][categorie[j]]);
} else { // create a new array
seriesNames[categorie[j]] = new Array();
}
}
}
}
// create the required output object
for(var attr in seriesNames) {
var obj = {};
obj['name'] = attr;
obj['data'] = seriesNames[attr];
series.push(obj);
}
// expected output is in series.
console.debug(series);
我推荐上面@nina scholz的答案。但是,如果有人想了解在简单JS中是如何完成的,请参阅以下代码:
var data = [{"Fruits ":"Apples","Fresh":"12","Rotten":"5","Total":"17"},
{"Fruits ":"Oranges","Fresh":"34","Rotten":"6","Total":"40"},
{"Fruits ":"Strawberries","Fresh":"67","Rotten":"8","Total":"75"},
{"Fruits ":"Bananas","Fresh":"23","Rotten":"5","Total":"28"}]
//list of items that needs to be in the final list
var categorie = ["Fresh", "Rotten", "Total"];
var seriesNames = {};
var series = [];
// iterate through the initial array
for(var i=0; i<data.length; i++){
// iterate through the category
for(var j=0; j<categorie.length; j++) {
if(data[i].hasOwnProperty(categorie[j])) {
// seriesNames will hold the category name and corresponding value will be an array of values(total, rotten, fresh) from all objects
if(seriesNames[categorie[j]]) { // array already exists
var arr = seriesNames[categorie[j]];
arr.push(data[i][categorie[j]]);
} else { // create a new array
seriesNames[categorie[j]] = new Array();
}
}
}
}
// create the required output object
for(var attr in seriesNames) {
var obj = {};
obj['name'] = attr;
obj['data'] = seriesNames[attr];
series.push(obj);
}
// expected output is in series.
console.debug(series);
输出如下所示
{
"Fresh":["12","34","67","23"],
"Rotten":["5","6","8","5"],
"Total":["17","40","75","28"]
}
这不是您想要的格式,因此我们可以再运行一次:
var output2 = [];
for (k in output) {
output2.push({ name: k, data: output[k] });
}
output2现在应该看起来像您想要的JSON
[{
"name":"Fresh",
"data":["12","34","67","23"]
},{
"name":"Rotten",
"data":["5","6","8","5"]
},{
"name":"Total",
"data":["17","40","75","28"]
}]
为了完善它,我们可以把它全部放在一个函数中
function nameMeSomething(data) {
var i, j, k, l, m = [], n = { Fresh: [], Rotten: [], Total: [] }; //ignore anything that isn't here.
for (i of data) for (j in i) if (typeof (l = n[j]) !== 'undefined') l.push(i[j]);
for (k in n) m.push({ name: k, data: m[k] });
return m
}
输出如下所示
{
"Fresh":["12","34","67","23"],
"Rotten":["5","6","8","5"],
"Total":["17","40","75","28"]
}
这不是您想要的格式,因此我们可以再运行一次:
var output2 = [];
for (k in output) {
output2.push({ name: k, data: output[k] });
}
output2现在应该看起来像您想要的JSON
[{
"name":"Fresh",
"data":["12","34","67","23"]
},{
"name":"Rotten",
"data":["5","6","8","5"]
},{
"name":"Total",
"data":["17","40","75","28"]
}]
为了完善它,我们可以把它全部放在一个函数中
function nameMeSomething(data) {
var i, j, k, l, m = [], n = { Fresh: [], Rotten: [], Total: [] }; //ignore anything that isn't here.
for (i of data) for (j in i) if (typeof (l = n[j]) !== 'undefined') l.push(i[j]);
for (k in n) m.push({ name: k, data: m[k] });
return m
}
我的解决方案得到的所有键的数值都超过了PO的术语,并且完全链接为一行答案 var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}]; var result=Object.keysdata[0] .filterk=>!isNaNdata[0][k] .mapk=>{ 姓名:k,, data:data.mapd=>d[k] };
console.logresult 我的解决方案得到的所有键的数值都超过了PO的术语,并且完全链接为一行答案 var数据=[{水果:苹果,新鲜:12,腐烂:5,总计:17},{水果:橙子,新鲜:34,腐烂:6,总计:40},{水果:草莓,新鲜:67,腐烂:8,总计:75},{水果:香蕉,新鲜:23,腐烂:5,总计:28}]; var result=Object.keysdata[0] .filterk=>!isNaNdata[0][k] .mapk=>{ 姓名:k,, data:data.mapd=>d[k] };
console.logresult;这里没有JSON。JSON是用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么就不是JSON,这里没有JSON。JSON是用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么您就不是在处理JSON。谢谢,这与我所寻找的非常接近,唯一的问题是它给出了{name:Fruits,data:[苹果,橙子,草莓,香蕉]我不想要,我只想要新鲜的,腐烂的和total@Imo首先,只需将其从keys数组中删除。我不知道它的第一个索引或静态名称,请参阅update。谢谢,这与我要查找的非常接近。唯一的问题是,它给出了{name:Fruits,data:[苹果、橙子、草莓、香蕉]我不想要,我只想要新鲜的,腐烂的和total@Imo首先从keys数组中删除它。我不知道它的第一个索引还是静态名称,请参阅更新。