2016-07-05 19 views
1

Wie kann ich Daten von einem Array durch zweimaliges Iterieren erhalten? Zum Beispiel habe ich einen Datensatz:Wie wiederhole ich zweimal innerhalb eines Arrays?

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

Zuerst möchte Ich mag auf der rechten Seite zu durchlaufen und alle Schlüssel bis zum Ende des ersten Objekts und dann nach unten, so dass ich alle Werten des Schlüssels erhalten so dass ich

Erwartete Ausgabe

[{ 'name': 'Fresh', 
    'data': [12, 34, 67, 23] 
    }, 
    { 
    'name': 'Rotten', 
    'data': [5, 6, 8, 5] 
    }, 
    { 
    'name': 'total', 
    'data': [17, 40, 75, 28] 
    }] 

Bisher habe ich versucht, dies:

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

Aber ich bin stecken, wie man das Datenarray bekommt und verbinde es mit seriesName. Live-Kopie: plunker

EDIT Die Schlüssel, Werte und Datenlänge variabel sind, da ich mit dynamischen Daten zu tun habe.

+1

hier keine JSON Es gibt. JSON ist eine * textuelle Notation * für den Datenaustausch. [(Mehr)] (http://stackoverflow.com/a/2904181/157247) Wenn Sie mit JavaScript-Quellcode arbeiten und sich nicht mit einem * string * befassen, haben Sie es nicht mit JSON zu tun. –

Antwort

4

Sie könnten eine Gruppe Array verwenden und es für das Recht im Ergebnis Array Gruppierung verwenden.

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

Nur etwas für dynamische Eigenschaften geändert Vorschlag. Es braucht nur Eigenschaften mit endlichen Zahlen.

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

Hier ist eine Möglichkeit, es zu tun:

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

Ich schlage vor, Sie mit den Ausgangsobjekten arbeiten direkt und fügen Sie sie später zu einem Array:

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

Da Sie underscore verwenden es tatsächlich ist eine ziemlich einfache map über die collec tion.

Zuerst finden Sie die Schlüssel der Objekte.

Später, mit map können Sie die erforderliche Eigenschaft des Objekts erhalten.

var keys = _.keys(data[0]).reverse() 
keys = _.without(keys, keys[0]) 


var c = _.map(keys, function(k) { 
    return { 
    name: k, 
    data: _.map(data, k) 
    }; 
}); 

Auch mit einem Plunker: https://plnkr.co/edit/KtJPMu?p=preview

+0

Danke das ist sehr nah an dem, was ich suchte das einzige Problem ist, dass es gibt {"name": "Früchte", "Daten": ["Äpfel", "Orangen", "Erdbeeren", "Bananen"] welche Ich möchte nicht, dass ich nur Daten für frisch, faulen und insgesamt – Imo

+0

@Imo will, einfach entfernen Sie es einfach aus der Tasten-Array zuerst. Ich weiß nicht, ob sein 1. Index oder static name, siehe update. – Atais

2

Verwendung 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

Sie können so etwas wie dies versuchen:

Sie eine Liste haben kann k Eys, die ausgeschlossen werden müssen und Schlüssel basierend auf dieser Liste verarbeiten.

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

Try this:

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

Ausgabe wie folgt aussieht:

[{"name":"Fresh","data":["12","34","67","23"]}, 
{"name":"Rotten","data":["5","6","8","5"]}, 
{"name":"Total","data":["17","40","75","28"]}] 
+0

Ihre Antwort ist @ Ninas Antwort sehr ähnlich. Überprüfen Sie ihre Antwort .. – Rajesh

0

Ich empfehle oben Antwort würde @ nina-scholz ‚s. Aber wenn jemand will, um zu sehen, wie genau es in einfachen JS getan hat, siehe unten Code:

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 sieht wie folgt aus (JSON)

{ 
    "Fresh":["12","34","67","23"], 
    "Rotten":["5","6","8","5"], 
    "Total":["17","40","75","28"] 
} 

Dies ist nicht ganz Format wollen, so können wir durch sie ein weiteres Mal ausgeführt wird:

var output2 = []; 
for (k in output) { 
    output2.push({ name: k, data: output[k] }); 
} 

output2 sollte jetzt l so schnell und wie wollten Sie (JSON)

[{ 
    "name":"Fresh", 
    "data":["12","34","67","23"] 
},{ 
    "name":"Rotten", 
    "data":["5","6","8","5"] 
},{ 
    "name":"Total", 
    "data":["17","40","75","28"] 
}] 

es vertilgen, wir sie alle zusammen in einer Funktion

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

Meine Lösung erhält alle Tasten mit numerischen Werten werfen (was mehr als PO Bedingungen ist) und vollständig als Antwort in einer Zeile angekettet.

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

Verwandte Themen