web-dev-qa-db-fra.com

Récupération dynamique des clés d'un tableau JSON Array - Javascript

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?

11
Queryer

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
17
nrabinowitz

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;
    };
11
Sahil Muthoo
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")

défensivement

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])
    }
}
4
Billy Moon

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;
4
Jordão

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"]
2
Do-Gyun Kim

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"]
2
maerics

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

0
user1686644

arrêtez de réinventer la roue !

Object.keys()

MDN

0
gondwe
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));
0
Tukaram Patil Pune

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

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
  }
}
0
sangeeth kumar