2016-07-05 61 views
1

如何通過在數組中迭代兩次從數組中獲取數據。比如我有一個數據集:如何在數組內迭代兩次

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"} 
] 

首先,我想遍歷右側,並得到所有的鑰匙,直到第一個對象的末尾,然後向下,這樣我拿到鑰匙的所有值所以我得到

期望輸出

[{ 'name': 'Fresh', 
    'data': [12, 34, 67, 23] 
    }, 
    { 
    'name': 'Rotten', 
    'data': [5, 6, 8, 5] 
    }, 
    { 
    'name': 'total', 
    'data': [17, 40, 75, 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]) 
    } 

但我堅持如何獲取數據數組並將其與serialName一起加入。活拷貝:plunker

編輯 鍵,值和數據長度是可變的,因爲我處理的動態數據。

+1

這裏沒有JSON。 JSON是用於數據交換的*文本符號。 [(More)](http://stackoverflow.com/a/2904181/157247)如果你正在處理JavaScript源代碼,而不是處理*字符串*,那麼你不會處理JSON。 –

回答

4

你可以使用一組陣列,並使用它的結果數組中的分組的權利。

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" }], 
 
    groups = ["Fresh", "Rotten", "Total"], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    groups.forEach(function (b, i) { 
 
     result[i] = result[i] || { name: b, data: [] }; 
 
     result[i].data.push(+a[b]); 
 
    }); 
 
}); 
 

 
console.log(result);

只是微微一變提議動態特性。它只需要有限數量的屬性。

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" }], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    Object.keys(a).forEach(function (k) { 
 
     if (isFinite(a[k])) { 
 
      if (!this[k]) { 
 
       this[k] = { name: k, data: [] }; 
 
       result.push(this[k]); 
 
      } 
 
      this[k].data.push(a[k]); 
 
     } 
 
    }, this); 
 
}, Object.create(null)); 
 

 
console.log(result);

0

下面是做這件事:

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; 
},[]); 
0

我建議你直接輸出對象的工作,並將它們添加到一個數組後:

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 fresh = {name: 'Fresh', data: []}; 
 
var rotten = {name: 'Rotten', data: []}; 
 
var total = {name: 'Total', data: []}; 
 

 
data.forEach(function(fruit) { 
 
    fresh.data.push(+fruit.Fresh); 
 
    rotten.data.push(+fruit.Rotten); 
 
    total.data.push(+fruit.Total) 
 
}); 
 

 
var output = [fresh, rotten, total]; 
 
console.log(output);

1

因爲實際上使用underscore它是一個非常簡單的map收集灰。

首先,查找對象的關鍵字。

後來,與map您可以獲得該對象所需的屬性。https://plnkr.co/edit/KtJPMu?p=preview

+0

感謝這與我所尋找的唯一問題非常接近,它給出{「名稱」:「水果」,「數據」:[「蘋果」,「橘子」,「草莓」,「香蕉」]我不希望我只想要新鮮,爛的數據和總數 – Imo

+0

@Imo,只需先將它從鍵陣列中移除即可。我不知道它的第一個索引或靜態名稱,請參閱更新。 – Atais

2

使用array.prototype.map

var arr = [ 
 
{"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 newArr = ["Fresh", "Rotten", "Total"].map(function(item) { 
 
    return { 
 
    name: item, 
 
    data: arr.map(function(innerItem) { 
 
     return parseInt(innerItem[item],10); 
 
    }) 
 
    } 
 
}); 
 

 
console.log(newArr);

2

你可以嘗試這樣的事情:

你可以有一個列表

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

而且ķ需要排除的eys以及基於此列表處理密鑰。

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 keys_to_exclude = ["Fruits"]; 
 
var _tmp = {}; 
 

 
data.forEach(function(o) { 
 
    for (var k in o) { 
 
    if (keys_to_exclude.indexOf(k.trim()) < 0) { 
 
     _tmp[k] = _tmp[k] || []; 
 
     _tmp[k].push(o[k]); 
 
    } 
 
    } 
 
}); 
 

 
var result = Object.keys(_tmp).map(function(k) { 
 
    return { 
 
    name: k, 
 
    data: _tmp[k] 
 
    } 
 
}); 
 

 
document.getElementById("r").innerHTML = JSON.stringify(result, 0, 4);
<pre id="r"></pre>

0

試試這個:

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"]}] 
+0

你的答案與@妮娜的答案非常相似。檢查她的答案.. – Rajesh

0

我會建議@尼娜 - 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); 
0
var i, j, ref, output = { Fresh: [], Rotten: [], Total: [] }; //ignore anything that isn't here. 
for (i of data) { 
    for (j in i) { 
    if (typeof (ref = output[j]) !== 'undefined') 
     ref.push(i[j]); 
    } 
} 

output看起來像這樣(JSON)

{ 
    "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現在應該升OOK像你想(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 
} 
0

我的解決辦法得到所有的鍵與數字值(比PO的條款更)並完全鏈接爲一行答案。

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 result = Object.keys(data[0]) 
 
    .filter(k => !isNaN(data[0][k])) 
 
    .map(k => ({ 
 
    name: k, 
 
    data: data.map(d => d[k]) 
 
    })); 
 

 
console.log(result);