J'ai une question qui voudrait solliciter votre expertise sur.
Ceci est un tableau JSON que j'ai:
[{"A":20,"B":32,"C":27,"D":30,"E":40}]
Ce que je voudrais faire est de récupérer les clés (A, B, C, D, E) du tableau JSON au lieu des valeurs. Je suis capable de récupérer les valeurs mais pas les clés.
J'utilise ceci pour récupérer les valeurs dynamiquement:
function calculateSum(jsonArray) {
var result = 0;
for (var i = jsonArray.length - 1; i >= 0; --i)
{
var o = jsonArray[i];
A = o.A;
B = o.B;
C = o.C;
D = o.D;
E = o.E;
result = A + B + C + D + E;
return result;
}
return result;
}
De même, que dois-je faire pour récupérer les clés en utilisant JavaScript?
Utilisez-vous D3.js comme l’indique votre balise? Parce que dans ce cas, vous pouvez simplement utiliser d3.keys()
:
var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
d3.keys(data[0]); // ["A", "B", "C", "D", "E"]
Si vous voulez la somme de toutes les valeurs, vous feriez mieux d'utiliser d3.values()
et d3.sum()
:
var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}, {"F":50}];
// get total of all object totals
var total = d3.sum(data, function(d) {
// get total of a single object's values
return d3.sum(d3.values(d));
});
total; // 199
Toutes les solutions publiées actuellement ont un problème. Aucun d'entre eux ne vérifie object.hasOwnProperty(prop)
lors d'une itération sur un objet à l'aide d'une boucle for ... in. Cela pourrait entraîner l'apparition de clés fantômes si des propriétés sont ajoutées au prototype.
Citant Douglas Crockford
Sachez que les membres ajoutés au prototype de l'objet seront inclus dans l'énumération. Il est judicieux de programmer de manière défensive en utilisant la méthode hasOwnProperty pour distinguer les vrais membres de l'objet.
Ajouter un chèque de hasOwnProperty
à l'excellente solution de maerics.
var getKeys = function (arr) {
var key, keys = [];
for (i = 0; i < arr.length; i++) {
for (key in arr[i]) {
if (arr[i].hasOwnProperty(key)) {
keys.Push(key);
}
}
}
return keys;
};
var easy = {
a: 1,
b: 2,
c: 3
}
var keys = [], vals = []
for (var key in easy) {
keys.Push(key)
vals.Push(easy[key])
}
alert(keys+" - tha's how easy baby, it's gonna be")
alert(vals+" - tha's how easy baby, it's gonna be")
Y compris la méthode défensive de @ Sahil ...
for (var key in easy) {
if (easy.hasOwnProperty(key)) {
keys.Push(key)
vals.Push(easy[key])
}
}
Utilisez for .. in
:
var result = 0;
for (var i = jsonArray.length - 1; i >= 0; --i) {
var o = jsonArray[i];
for (var key in o) {
if (o.hasOwnProperty(key)) {
result += o[key];
}
}
// in your code, you return result here,
// which might not give the right result
// if the array has more than 1 element
}
return result;
Je pense que c'est le plus simple.
var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
Object.keys( a[0] );
Résultat :
["A", "B", "C", "D", "E"]
Essayez d'utiliser l'instruction JavaScript for..in
:
var getKeys = function(arr) {
var key, keys = [];
for (i=0; i<arr.length; i++) {
for (key in arr[i]) {
keys.Push(key);
}
}
return keys;
};
var a = [{"A":20, "B":32, "C":27, "D":30, "E":40}, {"F":50}]
getKeys(a); // => ["A", "B", "C", "D", "E", "F"]
Je pense que cela devrait être analysé récursivement comme ci-dessous
var getKeys = function(previousKeys,obj){
var currentKeys = Object.keys(obj);
previousKeys = previousKeys.concat(currentKeys);
for(var i=0;i<currentKeys.length;i++){
var innerObj = obj[currentKeys[i]];
if(innerObj!==null && typeof innerObj === 'object' && !Array.isArray(innerObj)){
return this.getKeys(previousKeys,innerObj);
}
}
return previousKeys;
}
utilisation: getKeys([],{"a":"1",n:{c:"3",e:{ f:4,g:[1,2,3]}}})
Résultat: ["A", "n", "c", "e", "f", "g"]
var _ = require('underscore');
var obj = [{"A":20,"B":32,"C":27,"D":30,"E":40},{"F":50}, {"G":60,"H":70},{"I":80}];
var keys = [], values = [];
_.each(obj, function(d) {
keys.Push(_.keys(d));
values.Push(_.values(d));
});
// Keys -> [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' ]
console.log('Keys -> ', _.flatten(keys ));
// Values -> [ 20, 32, 27, 30, 40, 50, 60, 70, 80 ]
console.log('Values -> ', _.flatten(values));
Une boucle for-in
- fait l'affaire. Sur un objet cela ressemble à ceci:
var o = {
a: 5,
b: 3
};
var num = 0;
for (var key in o) {
num += o[key];
}
alert(num);
Essaye ça. C'est simple:
var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
for(var i in a){
for(var j in a[i]){
console.log(j); // shows key
console.log(a[i][j]); // shows value
}
}