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数组中删除它。我不知道它的第一个索引还是静态名称,请参阅更新。